/ 最近 .rdf 追記 編集 設定 本棚

log[20240929]



20240929() [AtCoder] 精進昨日あった ABC373-E How to Win the Election二分探索なのはすぐにわかるしかし罠がいくつもあって時間制限も厳しい中間獲得票上位 M 人の中に人 i が含まれない場合がまずは考えやすいその前に正確ではあるけどすんなりは理解できない問題i 番目 (1iN) の候補者はその候補者より多く票を獲得した候補者が M 人未満であるときかつその時に限り当選しますについて当落を分ける分岐点がどこにあるかをしっかり把握しなければ二分探索の判定関数が書けないi の得票が上から M 番目の人の得票に並んでいるときi は当選する逆にいえば上位 M 人の全員が人 i の得票を1票でも上回っていれば人 i は落選する判定関数はこう答え X を二分探索するときX を除いた票を上位 M 人に配って底上げした結果M 人全員が A[i]+X+1 以上になるなら判定は偽落選するでは M 人全員を A[i]+X+1 以上に底上げするのに必要な票数がどう計算できるだろう自分は最初 M 人の中間獲得票数の合計と追加票の合計で平均を出すような計算をして間違えた平均は出さなかったけどM 人の総得票数だけで考えて間違えたップの人が過剰に票を持っていたとしてもその余剰分を底上げにまわすことはできないゃあ M 人のうち何人が中間時点で A[i]+X+1 以上の票を持っていたかがわかればそれらの人を除外して累積和で必要な追加票数がわかるねこれは解の二分探索の中でさらに行う二分探索であって TLEった。提出 #58232088 (TLE×19)これが 2222昨日のコンテトはここまで提出 #58278984 (AC / 456 ms)解の二分探索をやめましたX 票を人 i を含む M+1 人に分配したとして底が上位 M 人のどの人とどの人のあいだにあるかを二分探索したっきの二重の二分探索の中の方を外に出した感じ18 行目と 19 行目にある不可判定(-1)と無条件当選判定(0)であるとか15 行目と 20 行目にあるボーダーラインの -1 だとかこちらの解法にはさらに罠が多いTLE になった log 2つの素直な解法とランダム入力に対する答えを突き合わせてデバッグをしたーダーラインの方は目指すべきグラフ(トグラム?)の形がイメージできていたので間違えなかったけど提出 #58279635 (C++ / AC / 303 ms)これは log 2つの解を二分探索する素直な解法の C++ージョンC++ では log^2 が許されていたのだ■制約に殺されたというにはしっかり難しくて満足できる問題だったいや実際に制約に殺されてるんだけどねお前に殺されるなら悔いはない過去23回の経験に加えて今回も言えるんだけどlog 1つの差ってっとした視点の違いなんですよっと見る角度を変えれば2つ目の log は消えるこれが Pairs の教え (20210401p01)■二分探索を尺取りで置き換えることで計算量のオーダーを改善する常套手段にのっとってついに二分探索の log を2つとも取り除いた。提出 #58342253 (AC / 970 Byte / 313 ms)これでますます制約に殺されたとは言いにくくなるんだけどこれがコンテト時間内にすらすら書けるなら青といわずとっくに黄色になっている