ABC256のF問題を変な解き方で通してしまった?
問題はこちら
正しいのかわかりませんが通ったので正義です
ちなみに提出はこれです
解法
step1
公式解説とほぼ同じ。
式をいじいじすると
となります。
公式解説はここから展開していますが今回はこのまま考えます。
まずはじめに初期状態での数列
次に、
-
のとき、x>y の値は最初に求めたものと変わらないのでそのまま出力しますD_y -
のとき、一番上のシグマの式よりx\leq{y} からD_y を引いて\frac{(y-x+1)(y-x+2)}{2}A_x を足せばこのときの正しい\frac{(y-x+1)(y-x+2)}{2}v の値が得られます。D_y
上の操作自体は
あとはクエリを貯めていって出力のたびに関係ある箇所 (
例えば、更新クエリが100個来た後に出力クエリが来たら100個分のクエリ内容をチェックして今回の出力に関係あるところは計算していけばうまくいきます。更新クエリが同じ
が、TLEします。(それはそう)
オーダーを計算すると
step2
ここからが今回の解法の主な部分です。
クエリが貯まるとそれに比例して出力の際計算が重くなることに着目してそれを解消すればいいのではと考えました。
具体的にはクエリを1000個貯めたら
それまでのクエリで言われたとおりに
制約から、再構築が行われる回数は最大で200回、常にクエリを1000個貯めている状態で出力していたとしても
これでTLEを回避し、AC!
おわりに
解説を書いていて、クエリを先読みして出力クエリの直前で再構築するかどうかの判断をしたほうがいいと思った。
また、今回は1000という設定で通ったが300くらいがより良かったのではないかと思った。
"つよい"皆様、正しくない部分があったら教えてください
Discussion