# AtCoder 練習帳: 2021 年 1 月~ 水色以降でも要復習かなというのに★をついけていく ABC126以降(6問構成)の E/F 埋めていこうかな (2021-04-23 memo)。 ## 2021-11-28 ### ABC229D - Longest X ニブタンで TLE, ニブタン+累積和で AC: [27579333](https://atcoder.jp/contests/abc229/submissions/27579333) ## 2021-05-08 ### ABC200D - Happy Birthday! 2 ★[剰余の性質] [解説](https://atcoder.jp/contests/abc200/editorial/1246)参照 201 通り検討すれば、そのなかで、mod 200 で分類したときに同じになるものが必ずある! なるほど! ## 2021-04-23 ### ABC126F - XOR Matching ★ [XOR の性質] わかんなくて、解説みた。 まず、\(0 \oplus 1 \oplus 2 \cdots \oplus (2^M - 1)\) が 0 になること(排他的論理和が \(2^M -1\) になるペアを偶数個つくれるので)に気づく(または知っている)必要があった。 また、そのことから、K 以外の 0 以上 \(2^M - 1\) 以下の整数すべての数の排他的論理和は、 \((0 \oplus 1 \oplus 2 \cdots \oplus (2^M - 1)) \oplus K\) となり、前半の括弧でくくった部分が 0 であることから、式全体の値は K になります。 以上のことがわかっていれば(加えて、若干の慣れがいるとは思うけど)、 解説にあるようなこたえが思いつけるかなぁ: [21964825](https://atcoder.jp/contests/abc126/submissions/21964825) ## 2021-04-11 ### ABC129E - Sum Equals Xor とけたけど、直前の桁の状態のみ用いる桁 dp だったので、状態変数を配列にする必要はなかった: [21630951](https://atcoder.jp/contests/abc129/submissions/21630951) ## 2021-04-09 ### ABC173E - Multiplication 4 方針がたってから、AC までに随分てこずってしまった。 - 入力の数列を、非負の要素と負の要素にわけて、それぞれ絶対値の大きいものから順にならべる - 答えが正になると仮定すると、以下の手順で答えがつくれる - 非負の要素、負の要素、それぞれの先頭二つの積を比較する - 非負の方が大きければ、非負の要素をひとつ取り出して用いる(ここがキモ) - 負の方が大きければ、負の要素を2つ取り出して用いる - 答えが正にできないときには、全要素を絶対値でソートしたものの小さいものから k 個かけたものが答え ひっかかったのは、以下の3点: 1. 正の要素はひとつずつ用いる(上述の「キモ」の部分) 2. 先頭2要素を書けたものは、long long に収まるのでそのまま大小比較するのだが、それと答えを求める変数をそのまま掛けると桁あふれしてしまう。(mod をとってからかける) 3. 負になるケースは、絶対値でソートしたものを用いて単純に書いた方がいい 提出例:[21588624](https://atcoder.jp/contests/abc173/submissions/21588624) ## 2021-03-29 ### ABC197E - Traveler これを落としたのは痛かった。反省。 値の小さい色から取っていくのだけど、ある色 Ci を塗り終わった時点の状態として ありうるのは、同じ色 Ci のうち一番右端のものの位置にいるか、一番左橋のものの位置にいるかの二通り。 そこで、以下のような状態を更新する dp を考える: $$
{ dp0[i] : 色 i を左から右の順で取り終わったときの、それまでの移動距離の最小値 dp1[i] : 色 i を右から左の順で取り終わったときの、それまでの移動距離の最小値 $$} 実際には、dpx[i+1] を求めるのに、ひとつまえの dpx[i] しか必要としないので、 状態を配列でもつ必要はない。 あとは、存在しない色の処理に少し気を付ける: [21374425](https://atcoder.jp/contests/abc197/submissions/21374425) ## 2021-03-26 ### ACL H - Two SAT 2-SAT は、蟻本 p.288~ にあるように SCC を用いて解くことができる。 また、ACL にはずばり 2-SAT を解くライブラリもある。 - SCC を使った投稿例:[21269641](https://atcoder.jp/contests/practice2/submissions/21269641) - 2-SAT を使った投稿例:[21269316](https://atcoder.jp/contests/practice2/submissions/21269316) この問題では、N ≦ 1000 なので (i, j) の全組み合わせについて距離が D 未満かどうかチェックして辺を張ることができたが、[ARC069F - Flags](https://atcoder.jp/contests/arc069/tasks/arc069_d) では N ≦ 10000 なので同じようにはいかなくて難しい(D について二分探索すればいいのだけど、辺を張るのに同じやり方では TLE になるはず)。 ## 2021-03-25 ### ARC114A - Not coprime ★ わかんなくて、解説みて実装。実装はむずかしくない: [21248311](https://atcoder.jp/contests/arc114/submissions/21248311) ## 2021-03-23 ### ABC196E - Filters min, max の合成がうまくできずに敗退。以下の 4 つを使えるようにしておこう。 1. max(x, y) + z = max(x+z, y+z) 2. min(x, y) + z = min(x+z, y+z) 3. max(x, min(y, z)) = min(max(x,y), max(x,z)) 4. min(x, max(y, z)) = max(min(x,y), min(x,z)) $${ max(x, y) + z = if x > y then x + z else y + z = if x + z > y + z then x + z else y + z = max(x+z, y+z) $$} 2 も同様に示せる。 3, 4 は、x, y, z の大小関係6通りそれぞれについて値を書き出して、同じになることを確認してしまおう。 $$