AtCoder Beginner Contest #126

published: ,
last modified: .

lang: ja

category: competitive_programming

tags: atcoder ocaml

A. Changing a Character

小文字にする.解答例

B. YYMM or MMYY

YYが00のときも駄目だと思ってしまった(西暦の下2桁なので00があってもよい).2桁ずつ取って,それが1以上12以下であれば月として使える.これを両方について試し,条件分岐すればよい. 解答例

C. Dice and Coin

ABCDEの中で一番困った. 解答例

NN面サイコロの出目をすべて試す(出目をvvとする).このとき得点がKKになる確率を調べたい.KvK \le vのときはサイコロを振った時点でゲームが終了するため,確率は11v<Kv \lt Kのときはコインを投げる必要がある.投げる回数をiiとすると,Kv×2iK \le v \times 2^{i}となる最小のiiを求めることになる.これはlog\logを用いてlog2Kvi\log_2 \frac {K} {v} \le iと変形できるから,i=log2Kvi = \lceil \log_2 \frac {K} {v} \rceil.従って確率は12i\frac {1} {2^i}.これをvvについて合計すればよい.

なおループでiiを求めても間に合ったようだ.これはループ回数が先のlog2Kv\lceil \log_2 \frac {K} {v} \rceilであることからO(NlogK)O(N \log K)となる.

D. Even Relation

図示するとよい. 解答例

まず奇数長の辺で結ばれた2つの頂点p,qp,qは違う色でなければならない.このとき,その一端qqからさらに繋がる点rrについて:

  • (q,r)(q,r)の長さが奇数長:q,rq,rは異なる色にする必要があるが,これは可能である((p,r)(p,r)の距離は偶数長であるからp,rp,rを同じ色にしてよい).
  • (q,r)(q,r)の長さが偶数長:(p,r)(p,r)の距離は奇数長になるからp,rp,rは異なる色である必要がある.p,qp,qp,rp,rがそれぞれ異なる色同士であるから,q,rq,rは同じ色.

よって奇数長の辺の一つの端点を選び,そこから繋がる点について再帰的に「辺の長さが奇数長であれば前の頂点と異なる色,偶数長であれば同じ色を塗る」処理を行えばよい.すべての辺が偶数長の場合はどのように頂点を塗ってもよいため適当に頂点を選べばよい.さらにすべてが偶数長でなくとも適当に頂点を選んでよい(奇数長の辺に遭遇するまですべて同じ色で塗ることになるが,その結果は奇数長の辺から始めた場合と同一であるから).

なお辺が偶数長であるときは本来両端に異なる色を塗ってもよいのだが,奇数長の辺が存在する場合失敗することがある.例えば辺(1,2)(1,2)の長さが11(2,3)(2,3)の長さが22のとき,2,32,3に異なる色を塗ると1,31,3の色が等しくなるが,距離は33と奇数.

E. 1 or 2

解答例

まずAXi+AYi+ZiA _ {X _ i} + A _ {Y _ i} + Z_iが偶数であることから,AXi+AYiA _ {X _ i} + A_{Y _ i}の偶奇が分かる.ここでAiA_iがすべて1122であることに注意すると,AXiA _ {X _ i}の値が分かればAYiA _ {Y _ i}の値も偶奇性から分かる(!).これは連鎖する:Ap+AqA_p + A_qAq+ArA_q + A_rの偶奇が分かっているとき,ApA_pの値が分かればAqA_qの値が分かり,さらにArA_rの値が分かる.

従ってこの関係を図示する,すなわち辺が各(Xi,Yi)(X_i,Y_i)であるようなグラフを描けば,各連結成分について1つ値が分かりさえすれば残りの要素もすべて分かることになる.したがって連結成分の数が答えとなる.これはUnionFind(またはDFSなど)で調べられる.

F. XOR Matching

抽象的に区間の共通部分をうまく使う方法を考えていたが浮かばず.解説放送でも触れられていたが構築問題なので実験してみるべきだった. 解答例

解けなかった構築問題の記事をどう書けばいいかは難しいところだが,結論から言うとK2M1K \le 2^M-1のときに次のような形を作るとほとんどの場合でうまくいく(ただし......にはKKは含まれない):

0,1,2,...,2M1,K,2M1,...,2,1,0,K0,1,2,...,2^M-1,K,2^M-1,...,2,1,0,K

こうするとKK以外の整数vv同士が作る区間の共通部分をそのまま使い回せて(vv同士のxorは00となるためxorが内側と等しくなる),その値は中央のKKとなる.KKが作る区間についてはK,...,2,1,0,KK,...,2,1,0,Kとなるが,このxorも実はほとんどの場合でKKとなる:

aaの値が2M12^M-1までであることに注目すると,この区間は

K,2M1,2M2,...K+1,K1,...,2,1,0,KK,2^M-1,2^M-2,...K+1,K-1,...,2,1,0,K

となり,xorはK2M1...0K \oplus 2^M-1 \oplus ... \oplus 0となる(順序を入れ替えることで......KKを含む).これはABC121-D: XOR Worldでも出題されたように隣り合う偶数と奇数のxorが11になることを利用すればK1...1K \oplus 1 \oplus ... \oplus 1となる.この11の個数は2M/22^M / 2であり:

  • M=0M = 0のとき:
    • 11の個数がバグるのでこの構築法は使えない.
    • 実際に試すとa={0,0}a=\{0,0\}しかない.よってK=0K=0のみが存在.
  • M=1M = 1のとき:
    • 1111個.よってxorはK1K \oplus 1となる.これがKKと等しいような数は存在しない(K1=KK \oplus 1 = Kの両側にKK \oplusを適用すれば1=01 = 0).すなわちこの構築法は使えない.
    • 一方で,入出力例にもあるようにM=1M=1でも解を持つことがある.全探索で求めればよい.パターンは4!2!2!=6\frac {4!} {2! 2!} = 6通り,対称性を考慮すれば0011, 0101, 0110, 100144つであり,ここからK=0K=0のときは複数の解が存在する一方で,K1K \ge 1のときは存在しないことが明らかになる.
  • M2M \ge 2のとき:
    • 112M/22^M / 2個であるが,これは偶数.従ってxorはK(1...1)K \oplus (1 \oplus ... \oplus 1) =K(0...0)=K= K \oplus (0 \oplus ... \oplus 0) = K
    • ゆえに確かにKK同士の区間のxorもKKとなるから,この構築法が使える.

最後にK>2M1K \gt 2^M-1の場合:このときは先の構築はできないが,00から2M12^M - 1までの数を適当に選んでxorで作れる値の最大値は2M12^M-1である(2M2^Mに相当するビットが立っている数が存在しないため,いかなるxorの結果もこのビットを持たない,すなわち2M2^M以上にならない)から弾いてしまって問題ない.

結論:

  • K2M1K \le 2^M - 1のとき
    • M=0M = 0またはM=1M = 1のとき: 実際に試すとK=0K = 0しかない
    • M2M \ge 2のとき: 構築法を用いると作れる
  • K>2M1K \gt 2^M - 1のとき: 作れない