Hello 2022 Dまで四完。Dの解法がギャグなのに気付かずWAを4つ出し、Eの実装が間に合わず終了。
— titia (@titia_til) January 3, 2022
A 対角線に一個おきに並べる。
B 最小値・最大値を管理。全体をカバーするものがあるときに注意。
C ループするまで同じところを聞く
D 角の八点を見る
2022年1月4日火曜日
Hello 2022
Dまで四完。なお、ツイートでは4WAと書いてますが、5WAだったようです。
コンテスト後のツイート
実装が間に合わなかったが、やり方はあっていた。
人を削らないなら、グループ年齢の平均値が大きい順に、教師の年齢が大きいものを割り当てるのが最適。
人を削ったら、そのソートした年齢順のリストの、あるindex xからindex yへうつる。その際、年齢平均のindexが[x, y]にあったグループのものは、一つプラス側かマイナス側にずれ、他は変わらない。
なので、初期状態、一つプラス側にずれた場合、一つマイナス側にずれた場合、それぞれについて教師を割り振ることができるかを前計算しておく。そして、各人を削るごとに、そのグループがx→yへうつるかを二分探索により計算し、そのグループの判定および、他の判定を上記のようにすれば良い。
私は、初期状態、プラス側、マイナス側についてセグ木を立てて実装したが、累積和でできる模様。
また、ソートに小数を使う必要はなく、ceilさえ分かっていれば良い(教師の年齢は整数なので)というのは目から鱗だった。
2021年12月30日木曜日
Codeforces Round #763 (Div. 2)
Dまで四完。
コンテスト後のツイート
Codeforces Round #763 (Div. 2) Dまで四完。
— titia (@titia_til) December 28, 2021
B r-lが小さい順にソート
C 決め打ち二分探索+後ろから見る
D 大学受験典型。数列の和をS-xSで求めるやつ
とりあえずEは放置します。
Educational Codeforces Round 120 (Rated for Div. 2)
Dまで四完。
コンテスト後のツイート
Educational Codeforces Round 120 (Rated for Div. 2) Eが分からず終了。
— titia (@titia_til) December 27, 2021
B 0と1で場合分けしてそれぞれをソート。
C 最初、min(A)をいくつまで減らすか三分探索かと思いハマった。何個そのままにするか? で全探索。
D 「最初に動かす1はどれか?」で場合分け
E. Math Test
解説AC。
abs(x) = max(x, -x)で変形するという典型だが、この式を使おうという発想が全く出なかったのはまずい。これにより、N人を、予想より高い点を取ったか、低い点を取ったか、で分けてbit 全探索する。
PyPyだとTLEにも悩まされた。
bit 全探索して、実際にきちんとスコアを求めているとTLEしてしまう。そうではなくて、プラス側に割り振った場合 x - r点を、マイナス側に割り振った場合 r - x点を取ったとして計算してしまっても最大値は変わらない(xを実際の点、rを予想の点としています)。それを利用すると定数倍改善されてACできる。
今回は定数倍の改善に過ぎないけど、これを利用して計算量を改善することもあると思うので、後半のテクニックも頭に入れておきたい。
2021年12月26日日曜日
Codeforces Global Round 18
pretest三完で終了。
Eは実質できていて、最後に間違いに気付き書き換えたものが間に合っていたら通っていました。うーん悔しい。
コンテスト後のツイート
E、通りました。最大値の初期化ミスでした。時間ギリギリで直せなかったのを直したら本当に通った。あと2秒あれば通ってたよ……。https://t.co/WNoDOGRb4a
— titia (@titia_til) December 24, 2021
赤はできるだけ葉に割り振りたい。それにより青が置ける個数をできるだけ減らす。深さ最大のものから消していく。青は全探索。
D. X(or)-mas Tree
解説AC。
考察が足りていなかった上、誤読もしていた。
木のpathに関する問題ということで(あと、STATUSを見たらPyPyでTLEが多く出ていたこともあり)、オイラーツアーとか、HL分解のようなことを考えてしまっていた。ちょっと苦手意識があるせいなのかね、こういう方面しか考えられなかったというのは。
が、そんなことは必要なかった。pathのxorだけを考えたいので、1~頂点xまでの累積xorをNODE[x]とすると、path u~v間のxorはNODE[u]^NODE[v]となる。これを使えば、エルフの条件も、uとvの間に辺を張ったものと解釈できる。
なので、後は、pathの距離が-1になっているものを後回しにしてDFS(つまり、01BFSみたいにする)していけば良い。
なお、誤読というのは、エルフに与えられるのが「距離を二進法にしたときの1の個数の2で割った余り」ではなく、単純に「距離を2で割った余り」だと思っていた、というものです。
これ、本番中実装してWAが出ていたら気付けなかった気がする……。
2021年12月21日火曜日
Codeforces Round #761 (Div. 2)
D1まで。
コンテスト後のツイート
D1 隣接三項を聞く。x,x+1,x+2とx+1,x+2,x+3が違う答えなら、x+1とx+2は違う値なので、それを使って判定していく。
— titia (@titia_til) December 16, 2021
D2. Too Many Impostors (hard version)
D1のように隣接三項を聞いていく方針でも、0や1の個数が(n/3, 2*n/3)ということを使っているため、同じ方針でいけるのかなー、と思うとそれではダメ。
さらに3/nということを強く利用するため、全体を3個ずつに分けるのがポイントだった。3個ずつの組のn/3個あると見て、その三つずつを全部聞くと、0や1の個数が(n/3, 2*n/3)なためその返答に0も1も含まれる。
そして、その組についてもう6回くらい聞くと、0や1を少なくとも一つ以上確定できる。
後はそれを利用するのだが、最初に聞いた3個組が0か1かを利用すると、各組二回ずつ聞いて答えを求めることができる。
E. Christmas Chocolates
解説AC。
操作により、xからxより小さい数へ遷移するのは一通り。それにより作られる木の直径が答え。シンプルだが、そのような頂点・辺からなるグラフだけ考えれば良い、というのが難しい。
ただ、思いつくのは難しくても、実験すれば気付けたような気もする。何も思い浮かばない時は実験するのが大事。
2021年12月15日水曜日
Codeforces Round #760 (Div. 3)
pretestは全完。このまま全問通るといいなー→システムテスト全完でした! Div. 3とはいえ、全完は久しぶりで嬉しい。
コンテスト後のツイート
E 全部足したのと、隣接の差を使う。
— titia (@titia_til) December 14, 2021
F 大体、後ろに1をくっつけるか前に1をくっつけるかなはずなんだけどWA。WAの原因が分からずランダムテストを書いていたら、制約が甘いから全列挙すれば良いかー、となった。(いまだにWAの原因は不明……)
F 末尾0のとき先頭に1付け加えるのはダメかー。確かにそうですね。
— titia (@titia_til) December 14, 2021
2021年12月14日火曜日
AtCoder Beginner Contest 230
Fまで六完。
コンテスト後のツイート
AtCoder Beginner Contest 230 Fまで六完。
— titia (@titia_til) December 3, 2021
D 区間スケジューリング
E ルートNで分ける
F 累積和Sを計算。和が0の区間があれば前の方を採用したい。たとえばS[3]=S[6]なら、DP[2]はDP[6]には加えない。もらうDPにしてセグ木で高速化。
G - GCD Permutation
解説放送を見てAC。
gcdが0でないということは、何かの倍数になっているということ。なので、2の倍数の項たち、3の倍数の項たち、4の倍数の項たち、5の倍数の項たち、6の倍数の項たち、……それぞれについて答えを求めることを考える。
この際、4の倍数の項たちは2の倍数の項たちを計算するときに既に足されているし、6の倍数の項たちは、2の倍数の項たち及び、3の倍数の項たちを計算するときに既に足されている。
なので、答えを求めた後、適切な係数を掛ける必要がある。
これは、エラトステネスの篩風にやれば求めることができる(なお、この係数をメビウス関数と呼ぶらしい)
次に、Pの方を見よう。2の倍数の項たちP[2], P[4], ...について、gcdが0でないものが何組あるか数えたい。
これも同じ方法を使えばできる。
……と書くと、まあそうか、という感じなのだが、コンテスト中はこの二回目も同じ方法が使えるということが思いつかなかった。
前半パートと後半パートで同じ方法を使う自然な問題なんだけど、なぜか逆に盲点になってしまった。
約数を扱う問題で斬新な手法を問われることはあまりなくて、いかに高速化(特に、エラトステネスの篩を使うことが多い)できるかが重要、というのが最近感じている印象です。
登録:
投稿 (Atom)