2024-08-12

EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2)に参加した

競プロアルゴCodeforces

Codeforces Div. 1 + Div. 2の参加記.

8月11日に開催された,CodeforcesのコンテストEPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2)に参加した.ABCの3完で8291位.

過去問を解いたことはあったもののCodeforcesのコンテストに出るのは初めてだったので,AtCoderのシステムとの違いに戸惑いながらの参加だった.

RustでCodeforcesに参加する場合,外部クレートであるproconioが使えないので標準入力からの受け取りを自前で実装する必要があるのだが,その際このブログ記事などが大変参考になった.

A - Distanced Coloring

問題概要

問題文

整数n,m,kn, m, kが与えられる.n×mn\times mのグリッドを,同色のどの2マス(x1,y1),(x2,y2)(x_1, y_1), (x_2, y_2)max(x1x2,y1y2)k\max(|x_1-x_2|,|y_1-y_2|)\geq kだけ離さなければならないという条件下で彩色するとき,必要な色数の最小値は?

考えたこと

いろいろ迷走してしまった.サンプル(n=m=3,k=2n=m=3, k=2)の彩色例を眺めて冷静になる.

ひとまずn,mn, mが十分大きい場合を考える.このとき,領域[0,k)×[0,k)[0, k)\times [0, k)はすべて異なる色で塗る必要がある.なぜなら,この領域内の任意のマスの組(x1,y1),(x2,y2)(x_1, y_1), (x_2, y_2)x1x2<k,y1y2<k|x_1-x_2|<k, |y_1-y_2|<kを満たすため,これらの(チェビシェフ)距離は必ずkk未満だからである.

よって少なくとも彩色にはk2k^2色必要なのだが,実はこの色数で十分であることが証明できる.具体的には,[0,k)×[0,k)[0, k)\times [0, k)の彩色パターンを平行移動させて領域[ik,(i+1)k)×[jk,(j+1)k)  (i=0,1,;j=0,1,)[ik, (i+1)k)\times [jk, (j+1)k)\;(i=0, 1,\cdots; j=0,1,\cdots)を塗れば良い.このとき,どの同色マスの組もxx座標の差とyy座標の差がいずれもkk以上であることが保証されているから条件を満たしている!

n<kn<kまたはm<km<kのときには領域[0,k)×[0,k)[0, k)\times [0, k)がマスからはみ出ることを考慮すると,最終的な答えはmin(k,n)×min(k,m)\min(k, n)\times \min(k, m)になる.

提出:https://codeforces.com/contest/2002/submission/275774039

B - Removals Game

こういうad hocにゲームの最適戦略を考える系はいつまでたってもできるようにならない……

問題概要

問題文

AliceとBobが1,,n1,\cdots, nの順列an,bna_n, b_nをめぐってゲームをする.各ターンではそれぞれが順に以下の行動を行う:

  1. Aliceがana_nの先頭か末尾の要素いずれか一方を削除する.
  2. Bobがbnb_nの先頭か末尾の要素いずれか一方を削除する.

このセットをn1n-1ターン行い,最終的に残ったaaの要素xxbbの要素yyを比較する.xyx\neq yならAliceの勝ち,x=yx=yならBobの勝ち.お互いが最適に行動したときどちらが勝つか?

考えたこと

いろいろ試していくうちに,Bobがだいぶ不利っぽいことが分かってきた.Aliceが選ばなかった要素をBobが選んでしまうとその時点で詰む.

ターン11でAliceが選んだ要素がx1x_1,Bobが選んだ要素がy1y_1だったとする.このときx1y1x_1\neq y_1だった場合,Aliceはそれ以降のターンで「y1y_1でないほうを選び続ける」という戦略でBobに勝つことができる(Alice側はx=y1x=y_1を最後まで残すことができる一方,Bobはもうy1y_1を削除してしまっているのでy1y_1を残せない!).

これは次以降のターンでも同じで,BobはAliceが選んだ要素を選ぶことを続けないと負ける.そのため,お互いが最適に行動したときにBobが勝つ条件は

という場合である.よって,ゲーム開始時点でa=ba=bまたはa=rev(b)a={\rm rev}(b)ならBobの勝ち,そうでない場合はAliceの勝ち.

コンテスト中はここの行間が埋められなくて苦しんだが,a,ba, bの同じ幅の連続部分列がつねに集合として一致しなければならない→aaで隣接するならbbでも隣接しなければならない→aabbは並びが同じor逆順,と考えて納得した.

提出:https://codeforces.com/contest/2002/submission/275830562

C - Black Circles

さんざん難しく考えて悩んだ割に結論が拍子抜けで悔しい.

問題概要

問題文

2次元平面上に点P1,,Pn{\rm P}_1,\cdots, {\rm P}_nがあり,これらの点を中心とした円C1,,CnC_1,\cdots, C_nを考える.時刻ttにおける円の半径はすべてttである.時刻t=0t=0にスタート地点S(xs,ys){\rm S}(x_{\rm s}, y_{\rm s})を出発して速度11で移動して,円の内部および周に入ることなしにゴール地点G(xg,yg){\rm G}(x_{\rm g}, y_{\rm g})まで到達できるか? ただし軌道はどのような曲線を描いてもよい.

考えたこと

直線距離で進まない方が最適なパターンがあるかもしれない,という思考にとらわれすぎて時間を浪費してしまった.

障害物(円)がない場合の最短到達時刻はt0SG=(xsxg)2+(ysyg)2t_0\equiv |{\rm SG}|=\sqrt{(x_{\rm s}-x_{\rm g})^2+(y_{\rm s}-y_{\rm g})^2}なので,この時刻t=t0t=t_0の時点でいずれかの円の内部(または周)に入ってしまう場合(あるiiPiGt0|{\rm P}_i{\rm G}|\leq t_0となる場合)は不可能.

意外なのは,そうでない場合必ず到達可能であるということだ.線分SG{\rm SG}上に任意に点P{\rm P}をとると,この点を通過した時刻はt=t0PGt=t_0-|{\rm PG}|である.このとき,三角形PiPG  (i=1,,n){\rm P}_i{\rm PG}\;(i=1,\cdots, n)に対して

PiP+PGPiG>t0|{\rm P}_i{\rm P}|+|{\rm PG}|\geq |{\rm P}_i{\rm G}|>t_0

が成り立つ.この時点での円の半径はt0PGt_0-|{\rm PG}|であるから,上の不等式PiP>t0PG|{\rm P}_i{\rm P}|>t_0-|{\rm PG}|は点P{\rm P}を通過した時刻において任意の円の外側にあることを意味する.

したがって,到達可能であるための必要十分条件は任意のiiに対しPiG>SG|{\rm P}_i{\rm G}|>|{\rm SG}|となることである.実装においては不等式の両辺を2乗して整数のまま比較すると正確.

提出:https://codeforces.com/contest/2002/submission/275835959

D1 - DFS Checker (Easy Version)

コンテスト中に解き切ることはできなかったものの,終了後に自力で通したのでこちらについても取り上げる.

問題概要

問題文

1,,n1,\cdots, nの番号が付いたnn頂点の完全二分木(頂点iiの子は2i2i2i+12i+1)と,1,,n1,\cdots, nの順列(pi)(p_i)が与えられる.以下のqq個のクエリを処理せよ.

考えたこと

(pi)(p_i)が与えられた二分木のDFS順として正しいかどうかを判定する代わりに,DFS順(のひとつ)が(pi)(p_i)になるような二分木が,与えられた二分木と同型かを判定することにする.

クエリを処理する前に,あらかじめDFS順が(pi)(p_i)になるような二分木を陽に構築し,隣接リストgraphと親のリストparをもっておく.また,

を前計算しておく.これは,各頂点v=1,,nv=1,\cdots, nに対してv/2=par[v]\lfloor v/2 \rfloor={\rm par}[v]かどうか(vvに親がないなら,v=1v=1かどうか)をチェックすることでできる.

あとは,クエリごとにp, graph, par, validを差分更新し,その都度すべてのvvに対しvalid[v]{\rm valid}[v]trueかどうかを判定すればよい.頂点i,ji, jのswapで影響を受ける頂点は高々8個(i,ji, jおよびその親と子)なので,計算量はクエリ数qqに対して線形である.

提出:https://codeforces.com/contest/2002/submission/275852278

雑感

全体的に問題がARCっぽい! 苦手!!

今までARCを避けてきたので瞬発力の低さが如実に表れてしまったなあ……という3時間だった.悔しいのでまた参加したい.