Educational Codeforces #59
A. Digits Sequence Dividing
ABCの中で一番難しい.CodeforcesのA問題では殆どの場合に適用できる最適解(端を取ったり中央を取ったりソートしたり2の倍数だったり)+コーナーケースの処理みたいなのを割と見る気がしていて,今回もそれ. 解答例
左を1桁だけ残して2つの数に分割すると,であれば必ず条件が達成できる(右のほうが桁が多くなるので必ず右のほうが大きい).のときは左右であれば条件に合うが,それ以外,すなわち左右のとき不適.このとき他に分割する方法もないので無理だと分かる.
B. Digital root
一見難しそうに見えるがとの関係を表にしてみれば一目瞭然という感じ:
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36
37 38 39 40 ..
すると求めるべき「となる番目の」は表の列目の上から番目の数.従って.
おまけ
"Digital root"で検索するとwikipediaの記事が出てきて,計算式まで載っている:.editorialにはここからでも求められると書いてある:においてと表示するとであるからとなり,これは番目(0-indexed)の数であることから(1-indexed)番目は.
C. Brutality
CodeforcesのC問題の難易度の基準がわからない. 解答例
同じボタンを回連続で押してしまうと駄目ということは,同じボタンの連続部分についてはその中の個しか選べないということ.逆に他のボタンの部分や同じボタンでも何か挟んだ位置のものについては気にしなくてよい[1].従って各ボタンの連続部分を独立に考え,その中の最大個を取ればよい.単純にソートしても間に合った.
D. Compression
数学に明るくないのでが切り上げか切り捨てか分からなくなったが右クリック→Show Math As→TeX Commandsしたら分かりやすくなった.切り上げなのは1-indexedのため.AC数が少なかったが,落ち着いて見たら特に難しくなかった. 解答例
要するに行列を同じサイズの正方形のピースに分割したとき各ピースの中身がすべて0かすべて1であるようなサイズの最大値を求めたい.2次元累積和を取りさえすれば,ある範囲内がすべて1であるか,すべて0であるか,1と0が混ざっているかがで分かる.サイズを固定したとき,各ピースに対してこれを試して前2つであれば問題なく圧縮可能,でなければ失敗.あとはピースのサイズを試していけばよい.候補はの約数なのでで求まり,これを大きい順に試す.
計算量解析をせずにだいたい調和級数のあれの二乗だから間に合うんじゃないかなで投げてしまった.累積和づくりに,約数生成にであり,これらは間に合う.最後の約数を順に試すところの最悪計算量を考えると (はの約数)となり,括弧部分は有名なで上から抑えられる.従って.
一回の約数を二分探索してしまったがどう考えても単調ではない[2].そんなこんなで2WAほど.
別解
editorialは理解できなかったものの(なんでその言い換えが……?),これと同じくgcdを用いる解法が浮かんだので試してみた.
1または0の1種類からなる部分行列であってこれ以上大きくできないもの[3]をブロックと呼んでみる.各ブロックを長方形と表現する[4].分割によってできる正方形は.
いま各ブロックは分割でできた正方形を並べて作られるから,長方形の左上および右下座標について と表現でき,ここからはすべてで割り切れることが分かる.逆にこの条件下で各ブロックは正方形だけから成り題意を満たすから,を割り切る数がの候補となる.求める値はの最大値であるから,これらのgcdを取ればよい.
さらに「」を示す:は,またはブロックの左隣にあるブロックの右下x座標+1 であり,ここから再帰的にが示せる.も同様.以上から [5].
肝心なのはの求め方.ただのDFSだと長方形にならず失敗することに注意.ここでは始点をとしたときまず方向に異なる要素にぶつかるまで掘り進める.ここをとする.以降は同様にしてを計算していき,となったら長方形を切り出すとよさそう.これなら必ず長方形になる. 解答例
提出コードはのはずだが重複して数える部分もあったりするからか累積和のコードよりだいぶ重い(実装も重かった).元の行列の要素を持つ配列mat
に対する取得,および訪れた要素かを格納する配列visited
に対する更新はそれぞれ区間の和や区間に対する加算で書けるはずなのでSegment Treeを使えたりするだろうか(未調査).
サンプルを作るのが意外と大変だったので,DFSで失敗する例を置いておく[6].
離れた位置の同じボタンについて:最大値を得たいという条件から,例えば
aaabbaa
のような配置のときにb
を1つも選ばない理由は無い.よって左右の部分にあるa
は絶対に連続せず,独立に考えられる. ↩︎分割が2の倍数のものばかり試しており気付けなかったが,たとえば次の行列ではサイズ3で分割できるものの2では不可能:
↩︎111000111000 111000111000 111000111000 000111000111 000111000111 000111000111 111000111000 111000111000 111000111000 000111000111 000111000111 000111000111
気持ち的には自然に長方形に分けたもの. ↩︎
左上の座標が,大きさが幅, 高さということ. ↩︎
今思うと実装でどうせが求まるので別にだけの条件にする必要は無かった. ↩︎
↩︎12 E00 E00 E00 1C7 1C7 1C7 E00 E00 E00 1C7 1C7 1C7