AGC025

A - Digits Sum

全探索をやるだけ。ちょっと違和感はあったが、解説を見るとなるほどだからAGCの200点なのか。んー、なんかこういうの解いた記憶があるなあ。いやまだ違和感はあるけど。解説のも実装そこまで軽そうには見えないよね。

B - RGB Coloring

700点でもBは簡単だろうという読みで順番にやっていく。
緑の得点が赤+青なことに注目し、緑を紫に脳内置換。ブロックの幅をA+Bとし、塗った面積を得点として図を眺める。赤と青は独立に考えて紫は考えなくてよさそうに見える。塗るブロックを下に寄せた場合を考えると、合計がKなら赤が増えれば青が減るという関係。よって、めいっぱい赤を増やした状態からだんだん赤を減らし青を増やして、しゃくとり法みたいにすればO(N)でなめることができる。赤と青の数を決めたときの通り数は、単にコンビネーションの掛け算。ライブラリあったかなと心配したが、少し前の俺えらい、ちゃんとしたのを作ってあった。

C - Interval Game

ゲームといっても、高橋君の戦略は区間のうち一番近い場所に行くだけだろう。さて、区間だと難しいので、幅0の区間として考えてみる。問題の特殊な場合を考えるのは、その場所で弱い敵を倒して経験値を得て、そしてボス(元の問題)に挑むというイメージ。
いくつかの例を紙に書いてみる。左右に何往復もさせるのがよさそうというのはすぐ気づく。しかし、具体的にどうぶん回せばいいかは難しい。高橋君の経路を図にいくつか描いているうちに、法則性に気づく。点が6個(スタート/ゴールの点も含めると7個)の場合、各「点と点の間」にある経路の本数は、246642みたいになっている。どうも必ず成り立ちそうな気がする。これで点の場合は解けた(気がする)。
区間は被っていたり含まれていたりするので厄介。ここで勘違いをする。「青木君の戦略を考えるので、高橋君に都合の悪い区間の外側を考えればよい」と。区間のどこへ移動するかは高橋君が決めるので、実際は「高橋君に都合のいい区間の内側」なのだが、ちょっと迷い込んでしまった。急に簡単になった(本当か?)ので違和感はあった。持ってなかった概念を扱うとこういう酷い間違いがそこそこの頻度で出てくるものだ。けっこう実装を進めてから気づいた。修正がそこまで大変じゃなかったのが幸い。
左右に振る2つの区間のペアを考える。左側は、右端が最も左にある区間の右端。その区間の左端は(もう)使わないので、右端の位置が同じなのが複数あればどれを選んでもいい(となると不安になるけどまあ)。さて、同様にして選んだ右側の区間と被ってる場合が気になる。ただ、その場合はそもそも高橋君は動く必要がない。なのでそこはcontinueすればいい。breakでいいんじゃないかとは思ったがちょっと恐れて変えなかった。
ACしたが、ガッツポーズというほどではない。いつもと比べて飛び抜けて高いパフォーマンスをとるときは、問題を簡単に感じるものだ。

D - Choosing Points

難しそう。とりあえず貪欲を書いて提出してみる。これはACを取りに行く提出ではなく、実行時間やWAの数で様子を見るためのもの。実行時間は問題なく、WAが9個。うん。D1が1のとき、D1とD2の偶奇が一致しないとき、色々考えてみるが、解けそうな気配はない。正直、3完で満足してしまっていて、何がなんでもこの問題を解くという気迫は消え失せている。なんとか体を動かすために、マラソン的にランダム要素を入れてみたりしてみる(ガッツリ時間をかけた実装)。あまりいい戦略ではない(お行儀という意味でも)と思うが、気持ちが切れているのに考えているふりをするよりはずっといい。上手くいく気配はなく、そりゃそうだよねという感じ。一応時間は捌けたのでよかった。