Educational Codeforces Round 123のきろく
問題文和訳はこちら
- A. Doors and Keys / Двери и ключи
- B. Anti-Fibonacci Permutation / Антифибоначчиевы перестановки
- C. Increase Subarray Sums / Увеличь суммы подотрезков
- D. Cross Coloring / Раскраска крестиками
- E. Expand the Path / Расширь маршрут: 未提出
- F. Basis / Базис (実行時間制限: 6 sec): 未提出
- 結果、感想
A. Doors and Keys / Двери и ключи
R
, G
, B
の各文字について大文字よりも前に小文字があるかを調べます。find
関数を用いたり、配列で既出かどうかを記憶するなどの方法があります。
B. Anti-Fibonacci Permutation / Антифибоначчиевы перестановки
降順順列 は条件を満たします。また、この順列の連続する2要素を入れ替えたものも条件を満たすので、これで 通りの順列を作ることができました。
C. Increase Subarray Sums / Увеличь суммы подотрезков
であるので であっても大丈夫なので、初期状態での全ての部分列の和を計算することができるので、長さ毎にその最大値を記憶します。長さ のものを とします。
この時 となるのでそれぞれ計算することができます。
D. Cross Coloring / Раскраска крестиками
最終的な盤面において各セルのについて何番目の操作で着色されたのかが分かれば、最終的な彩色に関わる操作が 個存在するとき答えは となります。
番目の操作は、それ以降に行 と列 の両方が塗り替えられる、もしくは全ての行か全ての列が塗り替えられる、のいずれかを満たした時、最終的な彩色に関わず、そうでないとき、関わります。そのため、最後の操作から逆順にどの行や列が操作されたかを記憶しておくことで答えを出せます。しかし、「全てのテストケースでの の和は を超えない」という制約はありますが、 についてはそうでないため、その和は にまでなる可能性があるので、配列で管理するとTLEとなります。そのため、出てきた行や列をstd::set
やstd::unordered_set
で管理して計算量を落とす必要があります。(これに気附かず、何度もペナルティを食らいました...)
E. Expand the Path / Расширь маршрут: 未提出
分かりそうで分からない...
F. Basis / Базис (実行時間制限: 6 sec): 未提出
さっぱりですね。
結果、感想
レートが上がりましたが、Dのペナルティ酷いなぁ... ちゃんと条件を読むようにしないと...