ABC294

6完。

A - Filter

入力を受け取りながら偶数のやつだけ出力。最後にスペースが入るけど、AtCoderはこれで大丈夫だったと思うからサンプルは目視で確認して提出。

B - ASCII Art

珍しくやるだけだ。けっこう気持ちいい問題。サンプルで遊んでるのもいい。

C - Merge Sequences

log付けずにできるんだけど、まあソートするよね。インデックスを書き戻すところだけやや難しい。

解説を見て。std::mergeは思い出さなかった。

D - Bank

一瞬priority_queueかと思うけど、logは付かない。ありがちなシチュだと思えば問題の趣旨はわかりやすいが、厳密にそのイメージでいいかの確認がかなりしんどかった。

解説を見て。クエリタイプ1にwhileは必要なかったな。ていうか何もしなくていいのか草。それでいい理由はけっこう難しいけど、問題が特殊な設定だったんだな。

E - 2xN Grid

解けるけど苦手。2行あるのを、どこまで配列にしてどこから別々の変数にするかの判断が難しい。全部配列にすべきだったか。方針としては、交互に伸ばすのは当然として、高々1個しか頭を出してないようにする。これによって、追い越すかそうでないかの2通りの場合分けで済む。1箇所vとlを取り違えて(幸運にも)サンプル合わず時間がかかった。

解説やばすぎ。ちょっと見ただけではわからない。

F - Sugar Water 2

2.5*10^9で4秒なので通らなくもない?割り算とか入ると無理だろうな(ていうかソート(あるいはnth_element)が必要なので完全に無理だったな)。2次元ベクトルの和がこの斜め線より下みたいなイメージで考えていると、目標濃度を決めて二分探索できそうだと気づく。目標濃度の砂糖水を取り除いてその残りの砂糖の量(マイナスでもいい)でソートしておけば二分探索できる(しゃくとりできると気づいたが二分探索のままにした)。目標濃度より濃いやつをカウントして、K以上だったら答えは今回の目標濃度以上。K以上(Kより大きいではなく)というのが重要で、K番目のやつにギリギリまで(ギリギリという表現必要か?)寄せていく。二分探索を2つ書いてるけど、誤差を気にするようなところはなさそう。不等号の向きは2通りなのでガチャをやった。どちらもダメで、内側の二分探索で符号を逆にするの忘れてた。

G - Distance Queries on a Tree

難しい要素は辺の重みが変更されることだけで、そこそこ簡単に解けるようにも見える。オイラーツアーでLCAを求めるコードは持っているので、そのセグ木に辺の重み(根から下がるときと上がるときで符号を逆にする)(オイラーツアーには頂点をN*2-1回乗せているが、出発地点以外に直前の辺の重みを乗せることにした)の和も乗せれば解けると思い実装していく。が、具体的なLCAの場所がわからない(何個上かはわかるが)。クエリ先読みすればあるいはと思ったけどそんな時間はなかったし、今考えると先読みしてもどうやるのかわからん。

(追記)具体的なLCAの頂点番号はセグ木で普通に求まっていました。ライブラリ貼り付けると本当に何も考えてない。いや意味不明すぎる。セグ木で最小値のインデックス求めるの普通にやるじゃん。それに気づいてからも、実装はけっこう大変だった。クエリの辺番号から対応するオイラーツアーの位置を2つ符号付きでテーブル引きしたけどそこがややこしかった。あとサンプル3に助けられたけど、辺がない場合に死んでた。最近たまにこういう頭ついてない動きあるけど、飽きたからパフォーマンス出ないだけだと思う/思いたい。