情報妖精の競プロ日記

AtCoderの問題に対する方針を主に書きます

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文字目 | 残りの文字)としましょうか。
この時、各文字について一番最初に出てきた場所 \leq 切断場所  < 一番最後に出てきた場所ならば両方に含まれます。
この方法なら、まず最初に出現地点を覚えるのにO(N)、次に切断場所の候補がO(N)、各切断場所について計算量はO(26) = O(1)となります。
全体としてO(N)で解けますね!

C - Attention

まず、i番目の人がリーダーであると仮定しましょう。
この時、リーダーより左側にいる西を向いている人とリーダーより右側にいる東を向いている人が振り向く人になります。
ここで、まず西について累積和sumWを考えると、リーダーより左側にいる西を向いている人はsumW_{N-1} - sumW_{i-1}で求まります。
同様に東も同じことをすれば、ある人がリーダーである場合の振り向く人がO(1)で求まります。
ということは、全ての人についてO(N)で求まるので解けます。

D - Xor Sum 2

まず、xorについても足し算と同じように分配や交換法則が成り立ったりすることは知っておいてください。
え、知らなかった?今覚えて。
さて、このことを考えると、範囲A_iからA_jについて等式が成立しているなら、この範囲における任意の部分集合について等式が成立します。
そこで、尺取り法というものを考えます。
まず、jを1ずつ増やしていきます。
そこで、A_iからA_jの範囲で等式が不成立になったなら、成立するまでiを増やします。
この時、(A_i, A_i)A_i, A_{i+1}、……、A_i, A_{j-1}では等式が成立していたはずなので、iを増やす度にj-i個を答えに加算します。
そうすれば、i, jが最後まで動いた時に答えが求まります。計算量はO(N)
オーバーフローには注意しましょう!

E - Range Minimum Queries

まず、XYを固定して考えてみます。
そうすると、Y以上の要素のみで構成された連続した部分列からしか値を取り出せないことが分かります。
また、この部分列からはなるべく小さい値を取り出すとしましょう。(Y固定なので)
このような取り方は、常に部分列に対し一番小さい値を含めるように範囲を定めれば取り出せます。
また、部分列の長さをLとするとその部分列からは要素を\max(0, L - K + 1)個取り出すことができますね。
……X不要なことに気付いたのでYだけを固定して考察します。
まず、先ほどの考察よりYを固定した時に取り出す値の候補は各部分列ごとにmax(0, L - K + 1)個の小さい値として出てきます。
後は、これをソートして小さい方からQ個取り出し、その時の最小と最大の差がその時のYにおける答えになります。
後はYを動かしていけば良いです。
Yの候補はN-Q+1個あるのでO(N)、その時における計算量はソートが最も大きくO(N \log N)で終わるので、全体でO(N^2 \log N)回で計算できます。

結果

ooox 3完(1400点) 81:18(4WA)
223位 パフォーマンス: 1961
レート: 1810→ 1826(+16)

感想

うーん、オーバーフローや不等号ミスという凡ミスで4WAしたのが痛い。
これは本当に、気を付けていれば対処できることなので間違えないようにしたい。
後は青コーダーなら尺取り法をミスるのはNG。
総じて、もっとパフォーマンス上げられるのに失敗したと言えるかな。