精進メモ 2021/09/13~
AOJ-ICPC、350が埋まったのでだんだん辛くなってきました。
AOJ-ICPC
1399 Sixth Sense
suzuken君に投げられました。
辞書順が無ければソートして小さい方から貪欲に詰めていってOKです。
そのときのスコアを計算する関数を作っておきます。
答えの数列を前から決めていきます。
ある箇所について、まずより大きいか、そうでないかを選択します。どちらも、条件を満たす中で最小のものを選びます。
そのときのスコアを計算し、最終的に大きくなる方を選びます。同じであれば辞書順が大きくなる方です。
その後、条件を満たすなかで辞書順が最大になるような値を探します。
ここは二分探索で求めることができます。
これを繰り返すことで答えが求まります。
1337 Count the Regions
を完全に失念していました。
座標圧縮すると、マス目上でUnionfindを行って連結成分の個数を数える問題になります。
Northern Eurasia Finals Online 2020
絶不調でした。
Geometrical Combinatorics
諸悪の根源です。一問目に開いたのが運のつきでした。
斜めの直線ごとに見ていけば、公式を使って計算できるはず…なのですが、結局最後まで通りませんでした。誤差なのか、考慮もれなのかはいまだわかってないです。
A. Almost Balanced Tree
2を優先的に使います。
2と1の個数を基本的に半分になるように分けます。ズレる部分は1を移動させて微調整します。
Lookup Performance
ある頂点にいるとき、クエリに対して再帰を行わない条件は、今いる頂点のminとmaxがであるとき、
のいずれかの条件を満たすことが必要です。
また、ある頂点でこれらを満たした時、その部分木における頂点全てが上記の条件を満たします。
ということで、(上記の条件を満たさない頂点の個数)×2 + 1が答えです。
1,2番目の条件は簡単に数えることができます。
3番目は、suzuken君にwavelet treeで殴ってもらいました。
ABC219
爆死しました。ICPCチームメンバーが温まっているのでヨシとします。
D - Strange Lunchbox
個使って個の鯛焼きを買えるときに購入できるたこ焼きの最大値、としてDPをします。
初期値を間違えて2ペナしました…
E - Moat
あなぽこは含むものだと思っていたら、Clarで含みませんと言われて泣きました。
結局そこからバグり続けて終わりました。
囲まれているかどうかをビット全探索すればOKです。
村を全て含むか、連結であるかどうかは簡単に判定できます。後者はUnionfindでOKです。
あなぽこ判定は、白のマスが外側と全て繋がっているか判定すればいいです。途中から実装をしたため、手抜き実装をしたら
1111 1001 1001 1111
のケースで落ちるような実装になっていました。
F - Cleaning Robot
日曜日に解きました。
文字列一回分を1セットとし、到着するマス目を洗い出します。
そして、1セット単位で移動する距離も計算します。
これらが共に0であった場合は1セット分のマス目の個数が答えです。
のうち片方が0であった場合(が0であるとします)、重なるパターンは、到着するマス目に対し、とが一致し、となる場合です(は操作回数)。
なので、ごとにをメモしていき、の区間の共通部分を全体で考え、区間の幅を計算すると答えになります。
どちらも0でなかった場合は、
に対するをメモすると、同様の計算で答えが求まります。
ARC126
不調の後には好調がやってきます。
A - Make 10
FAまであと少しでした。
長さ3のものは優先的に使います。
それが終わったら、4を優先的に使います。
あとは2だけで作って終わりです。
B - Cross-free Matching
LISに気づきませんでした。
個めの線分まで見終えて、最後に選んだ線分のがであるときに選べる線分の最大値
とします。で線分をソートしておくと、上記のDPをセグ木で更新できるようになります。
が同じものは同時に更新する必要があります。
C - Maximize GCD
とても好きな問題です。
とすると、全部の要素を以上にできる場合は答えが簡単に求められます。余った操作回数を均等に割り振るようにすればよいです。
そうでない場合を考えます。
がにできるかどうかを考えた時、それぞれの要素はの倍数でなければなりません。について、その値以上のの倍数は一意に定まり、をソートしておくと、目標となるの倍数が同じ要素については連続して並んでくれます。
ということで、境界を二分探索やしゃくとりで求められれば、必要な操作回数が求まります。
の倍数のみ調べるので、全体で調べる回数は調和級数で収まります。
D - Pure Straight
はじめに嘘DPを書いていて時間をロスしました。
番目が右端で、集合に含まれる要素が番目から順に左側にならぶように操作したときの操作回数の最小値、とします。ただし、番目までの要素のみを用います。このDPは、番目の要素を用いない場合
という遷移になります。
用いる場合、に、番目の要素を正しい位置へ移動するコストを足したもので更新させます。
これを、右側のみの要素のみで構築するパターンについてもどうようにDPで計算します。
最後に、両方のパターンをマージして、ちょうどが全体になるようなものを計算し、答えを求めればOKです。