コンテストへのリンク
A. Array with Odd Sum
和を奇数にしたいので、mod 2で考えると分かりやすい。
元々の和が奇数ならOK。
和を変えるためには、mod 2で0のものと1のものが存在していないといけない。
B. Food Buying
効率よくキャッシュバックをもらうには、10の倍数のものを買うのが良い。n円お金があるとき、n//10円のものを買う、としてシミュレーション。
C. Yet Another Walking Robot
同じ場所を二度通っていたら、その区間は削って良い。
ので、まずロボットがどう動くかシミュレーションして、同じ場所を二度通っていたらその区間を一つ出力。
D. Fight with Monsters
「モンスターを倒した次は自分のターン」というclarがないと問題文が不明確でした。もし、「自分が倒したら、次は相手のターンでスタート」だったら、大分面倒になりそうです。
今回の問題では、各モンスターについて、何回テクニックを使えば経験値を得られるか計算できるので、ソートして貪欲に使っていけばOK。
E1. String Coloring (easy version)
これは先にE2を見るべきでした。
二色ということにこだわってよく分からない実装をしてしまった。結局は、LISをO($N^2$)でやるのと同じことをしたと思うんだけど……。
E2. String Coloring (hard version)
index i, j (i<j)で、S[i]>S[j]のとき、その二文字は交換しなくちゃいけないので、別の色を割り当てなくてはダメ。
この考え方はLIS(今回はこの逆で、最長減少部分列)と同じですね。
本番では、LISと転倒数を混乱して、ライブラリを貼り間違えて悩んでいるうちに時間切れ……。
本番では、LISと転倒数を混乱して、ライブラリを貼り間違えて悩んでいるうちに時間切れ……。
けんちょんさんの解説記事では、ABCの問題と同一であると指摘されているけど、これが同一と理解するのは難しいと思う(私はまだよく分かってません……)。「LDSに帰着できる」、ということさえ分かればこの問題は解けます。
ただ、見た目の結構違う問題を同じと気付ける(言い換えられる)かどうかは、もっと難しい問題を解く上では大切ですよね……。
F. Berland Beauty
最初、全ての区間の美しさを$10^6$に設定しておき、美しさの最小値が大きい質問から順に、その区間のうち$10^6$の部分をその値に更新→十分性チェック、という方針でやった。
毎回DFSで区間を求めてもO(N*M)だから大丈夫なはず……と思ったらTLEでHackされてしまいました。
解法を少し変更して、更新された値が一つでもあればOK、として十分性チェックをなくしたりしてもダメ。
結局、TLEが出ていた原因は、node aとnode bを繋ぐedgeの番号を調べるとき、dict D[a,b]とtupleを使っていたのが不味かったようで。そこを(a<<13)+bのようにしたら通りました。
なお、初期値を0に設定して、質問された全ての区間を質問の値に更新していく……という方針もありますね。他の方のコードを見て知りました。
0 件のコメント:
コメントを投稿