yamake's blog

主に競プロ、たまに自転車

Codeforces Round #608 (Div. 2) A~Dまで

Codeforces Round #608 (Div. 2)のA~Dまでをやりました。

Eはもう少し考えてからやってみます。

 

 A問題で、両方試してしまいましたがefを比べれば十分でした。

B - Blocks

i \lt jとなるi,\ jについて、

i,\ i+1,\ i+2,\ ...,\ j-1となるようにpを選択していくとi,\ j両方の色を反転させることができます。

 

したがって、例えば白いマスが偶数個のとき

白いマスのペアを左から順に消していくことで答えを得られます。

黒いマスが偶数個のときも同様です。

 

C - Shawarma Tent

実は候補は学校に隣接する4マスしか無いので、全部のマスを調べられます。

 

D - Prtals

前から城iを攻略したあとの兵士の合計人数を配列sumなどに保存します。

次に、後ろから見ていって「城iを攻略したあとに城i+1を攻略するのに余る人数(つまりsum[i]-a[i+1])」を適当な配列bufに保存します。

後ろから見ていって、buf[i-1] \lt buf[i]となるiが現れたとき

i番目以降に防衛できる城を貪欲に防衛していくと最適解が得られます。

これは、最適解の集合中に含まれない任意の要素より前にあり、かつcが小さい要素が集合中に含まれないことから証明できます。