AtCoder Regular Contest 098
AtCoder Regular Contest 098に参加しました!
ABC098 beta:
https://beta.atcoder.jp/contests/abc098/beta.atcoder.jp
ARC098 旧版:
arc098.contest.atcoder.jp
ARC098 beta:
https://beta.atcoder.jp/contests/arc098/beta.atcoder.jp
解けた問題だけ解説をしていきますー
要項
AtCoder Beginner Contest 098 / Regular Contest 098
rated 1200 / 2800
5/26(土) 21:00 ~ 22:40 (100分)
100-200-300-500-600-1000 (6問)
ペナルティ: 5分
方針
C,D,Eまで解いて終了かな
早解きコンテストなのは確定
A - Add Sub Mul
比較してください。以上。
一つヒントとして、algorithmのmax関数は、max({A, B, C})のようにすることで一度に複数の要素の最大を取り出すことができます。
B - Cut and Count
各切断箇所に対して愚直に考える方法もありますが、せっかくなのでちょっと綺麗な解法を考えてみましょう。
各文字に対し、一番最初に出てきた場所と一番最後に出てきた場所を覚えておきます。
また、切断場所は指定した場所の右側(例えば切断場所を1文字目とすると、1文字目 | 残りの文字)としましょうか。
この時、各文字について一番最初に出てきた場所 切断場所 一番最後に出てきた場所ならば両方に含まれます。
この方法なら、まず最初に出現地点を覚えるのに、次に切断場所の候補が、各切断場所について計算量はとなります。
全体としてで解けますね!
C - Attention
まず、番目の人がリーダーであると仮定しましょう。
この時、リーダーより左側にいる西を向いている人とリーダーより右側にいる東を向いている人が振り向く人になります。
ここで、まず西について累積和を考えると、リーダーより左側にいる西を向いている人はで求まります。
同様に東も同じことをすれば、ある人がリーダーである場合の振り向く人がで求まります。
ということは、全ての人についてで求まるので解けます。
D - Xor Sum 2
まず、xorについても足し算と同じように分配や交換法則が成り立ったりすることは知っておいてください。
え、知らなかった?今覚えて。
さて、このことを考えると、範囲からについて等式が成立しているなら、この範囲における任意の部分集合について等式が成立します。
そこで、尺取り法というものを考えます。
まず、を1ずつ増やしていきます。
そこで、からの範囲で等式が不成立になったなら、成立するまでを増やします。
この時、、、……、では等式が成立していたはずなので、を増やす度に個を答えに加算します。
そうすれば、が最後まで動いた時に答えが求まります。計算量は。
オーバーフローには注意しましょう!
E - Range Minimum Queries
まず、とを固定して考えてみます。
そうすると、以上の要素のみで構成された連続した部分列からしか値を取り出せないことが分かります。
また、この部分列からはなるべく小さい値を取り出すとしましょう。(固定なので)
このような取り方は、常に部分列に対し一番小さい値を含めるように範囲を定めれば取り出せます。
また、部分列の長さをとするとその部分列からは要素を個取り出すことができますね。
……不要なことに気付いたのでだけを固定して考察します。
まず、先ほどの考察よりを固定した時に取り出す値の候補は各部分列ごとに個の小さい値として出てきます。
後は、これをソートして小さい方から個取り出し、その時の最小と最大の差がその時のにおける答えになります。
後はを動かしていけば良いです。
の候補は個あるので、その時における計算量はソートが最も大きくで終わるので、全体で回で計算できます。
結果
ooox 3完(1400点) 81:18(4WA)
223位 パフォーマンス: 1961
レート: 1810→ 1826(+16)
感想
うーん、オーバーフローや不等号ミスという凡ミスで4WAしたのが痛い。
これは本当に、気を付けていれば対処できることなので間違えないようにしたい。
後は青コーダーなら尺取り法をミスるのはNG。
総じて、もっとパフォーマンス上げられるのに失敗したと言えるかな。