Di の最小値は多くの場合 d1,2 に一致します。」 和の「最小値」が「多くの場合」答えに一致するとか、そんなざっくりした掴まえ方は出て来んで。結果として自分と同じ考え方の提出が全然見つからないのはとても嬉しい(そういうタイプの人間)。
1 日に複数本の道を使うことはできないことに注意してください」の一文を念頭に置いて考えれば、むしろどうしてこれが問題になるのかわからなくなった。パスとか何日目に訪れたとか関係なく、街の集合を一日一日拡大していくことを考えるだけ。とはいえ制約が厳しい。新しく訪問した街があればそこから移動できる未訪問の街を最初に訪問可能になるのが何日後かをセグメント木で管理した。■提出 #32487113 (AC / 995 Byte / 1952 ms)。2183 ms で TLE になったので 200 ms をミクロなチューニングで稼いでの AC。「Ruby によるすべての提出」を見ると他3つの AC はプライオリティキューを使用していて時間も 1216 ms から 1804 ms と余裕があるようだった。たぶん
W[X]
(X 日目に訪問可能になる街の集合を記憶する配列)に相当する役割を担っているんだろう。■提出 #32487597 (AC / 1027 Byte / 1210 ms)。自分でもプライオリティキューで書いてみた。ずいぶんシンプルに書けた気がしたけど、セグメント木とプライオリティキューのコード量の差により実際にはサイズが増えている。こちらの方が簡単に書けて簡単に読めるけどね。それにも関わらずプライオリティキューを使うんだというヒントをもらうまでは思いつきやしなかったけどね。■■■精進2。第6回PAST-K「共通クーポン」。DP ができなくて解けていなかった問題。■提出 #32492522 (AC / 480 Byte / 340 ms)。N の上限が 10 万だけど、N=10000 で TLE になる明らかにまずい DP をしている。ケースが弱い。■提出 #32492799 (AC / 431 Byte / 215 ms)。こちらが正しい DP。これなら前処理を省いても十分に時間が足りたと思う。この問題の入力は DP よりも前処理の方が効果的であるようなものだけど。1 日に複数本の道を使うことはできないことに注意してください」に阻まれている。それを言われてしまうと厳しい制約の三重苦のもとでどういう状態管理が許されるのかわからなくなるんよ。
strong
と yowai_sushi
ってそういうことか(2本のソート列)。そして、その提出によれば2本のソート列から K-X 個を取るパートはない。1本目のソート列から X 個を超えて取る方が良くなるケースは、X を増加させた後のループで試行されるのを待てばいいのだから、それはそう。そしてだからこそ、40 行目 tmp = intstrong[t] + intyowai[k - t] + t*t
において K 個の実際の種類数が t 種類より多くてスコア計算が不正確であっても(不当に低くても)無視して良い。難しいなこれ。ある時点のループにおいてベストを求めなくていいし不正確でもいいということを見極めて受け入れるのは。sk
か sk%P
かという違い。余りをとるコストをケチってかえって Bignum のコストを支払って TLE になっていたのだった。あほ。■F 問題「Operations on a Matrix」(青 diff)。昨日は問題を読みもしなかった。やることは明らかだけどどう効率的に実装するかという問題。□最初の提出 #32096736 は TLE/MLE になった。長さ 20 万になりうる配列を最大 20 万回複製しようとしていたのだから、40 ギガを数倍したコストが予期される。TLE/MLE も当然。□次の提出 #32097180 で AC。クエリ先読みで必要な値だけ覚えるようにした。典型です。最近では ABC202-E「Count Descendants」を解くときに同じことをした>TLE、AC。E 問題を AC してから 50 分だから、%P
を %P
とタイプするだけの手間で E 問題を AC に持って行けていれば6完もありだった。幸せな皮算用。