5完。時間がなさすぎる。
A - chukodai
0-indexedに直してswap。よどみなく書けた。
B - Who is missing?
枚数をカウントするコードを書き始めてしまったが、これはxorでできる。全部のカードの総xorは0(同じカード2枚や4枚で0になりそれがN個なので)なので、そこから1枚抜いたら答えそのものが出てくる。
C - Route Map
またstd::setか?と思ったがこれは線形でできる。しゃくとりみたいにやる。元々素早く書くのは苦手なタイプの実装だが、std::setを迷わず捨てれるくらいには書けるようになった。
D - Dance
全探索っぽいけど、これがCではなくDに出ているというのが怖い。16人いてペアを作っていく。最初の人の相手が15通り。次に、残った中で最も番号の若い人の相手を決める(13通り)。これを繰り返すと200万通りくらいになる(ここで、プログラムを書かずに、Google検索で15*13*...*3*1と打ち込んでしまったのはよくなかった)。あとは実装だが、DFSするしかなさそう。手抜き実装したときの計算量がよくわからないので、ほどほどに頑張る。明らかに簡単なのに、慣れていないというだけでこんなにもしんどい。「残った中で最も番号の若い人」というのが、「残った中からテキトーに一人選ぶ」でもいいのかどうか全然わからなかった。
一発で通したのはえらいけど、100分しかないABCでDに20分使うのは、うーん。もっとも、苦戦した人が相当多かったみたいなので相対的には悪くない。ただ、今回重要なのは絶対的な20分だった。Fを楽しむ時間がそのまま削られてしまった。
E - Average and Median
こんなの難しいに決まってるじゃん。しかも平均と中央値の2問解いてやっと500点でしょ。Fへ。
何枚選ぶか決まってないのがつらかったけど、落ち着いて考えると二分探索で両方できる。ターゲットとなる平均値を達成できるかは、その値より上に飛び出てるのと下に出てるのを比較して下が多かったらダメ。はー、よく知った方法だった。中央値はやや難しそうだが、同様にできる。ここで言う中央値は偶数個のときにちょっと小さいのを選んでる。ターゲットの値より小さいものとそうでないものの個数を比較して、同じだったらダメ(ターゲット以上のが多かったらOK)。あとは普通にDP。今思うと、メモリ節約したほうが最初の2個を場合分けせずに済んでよかったかな。
終了位置はどこでもいいとしていてWA。最後に選ぶカードは、N番目かN-1番目である必要がある。
F - Spices
このbitたちをカバーする最小コストでbitDPとかを考えるが、掃き出しとか基底とか全然わかってないことを改めて見せられる。Gへ。
普通に掃き出しをちょっとアレンジするくらいでできないか?わからなかった。
G - Good Vertices
そもそも愚直の計算量がすぐにはわからない。最短距離とかではないのが難しいが、まあBFSみたいな感じでやれば。ああ、Lが大きいのここで効いてくるのか。コンテスト中には解けそうにないので、ここで順位表を見てEに戻る。