2024-08-12
EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2)に参加した
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
問題概要
整数が与えられる.のグリッドを,同色のどの2マスもだけ離さなければならないという条件下で彩色するとき,必要な色数の最小値は?
考えたこと
いろいろ迷走してしまった.サンプル()の彩色例を眺めて冷静になる.
ひとまずが十分大きい場合を考える.このとき,領域はすべて異なる色で塗る必要がある.なぜなら,この領域内の任意のマスの組はを満たすため,これらの(チェビシェフ)距離は必ず未満だからである.
よって少なくとも彩色には色必要なのだが,実はこの色数で十分であることが証明できる.具体的には,の彩色パターンを平行移動させて領域を塗れば良い.このとき,どの同色マスの組も座標の差と座標の差がいずれも以上であることが保証されているから条件を満たしている!
またはのときには領域がマスからはみ出ることを考慮すると,最終的な答えはになる.
提出:https://codeforces.com/contest/2002/submission/275774039
B - Removals Game
こういうad hocにゲームの最適戦略を考える系はいつまでたってもできるようにならない……
問題概要
AliceとBobがの順列をめぐってゲームをする.各ターンではそれぞれが順に以下の行動を行う:
- Aliceがの先頭か末尾の要素いずれか一方を削除する.
- Bobがの先頭か末尾の要素いずれか一方を削除する.
このセットをターン行い,最終的に残ったの要素との要素を比較する.ならAliceの勝ち,ならBobの勝ち.お互いが最適に行動したときどちらが勝つか?
考えたこと
いろいろ試していくうちに,Bobがだいぶ不利っぽいことが分かってきた.Aliceが選ばなかった要素をBobが選んでしまうとその時点で詰む.
ターンでAliceが選んだ要素が,Bobが選んだ要素がだったとする.このときだった場合,Aliceはそれ以降のターンで「でないほうを選び続ける」という戦略でBobに勝つことができる(Alice側はを最後まで残すことができる一方,Bobはもうを削除してしまっているのでを残せない!).
これは次以降のターンでも同じで,BobはAliceが選んだ要素を選ぶことを続けないと負ける.そのため,お互いが最適に行動したときにBobが勝つ条件は
- 任意のターンにおいて,数列の先頭・末尾と数列の先頭・末尾が集合として一致する.
という場合である.よって,ゲーム開始時点でまたはならBobの勝ち,そうでない場合はAliceの勝ち.
コンテスト中はここの行間が埋められなくて苦しんだが,の同じ幅の連続部分列がつねに集合として一致しなければならない→で隣接するならでも隣接しなければならない→とは並びが同じor逆順,と考えて納得した.
提出:https://codeforces.com/contest/2002/submission/275830562
C - Black Circles
さんざん難しく考えて悩んだ割に結論が拍子抜けで悔しい.
問題概要
2次元平面上に点があり,これらの点を中心とした円を考える.時刻における円の半径はすべてである.時刻にスタート地点を出発して速度で移動して,円の内部および周に入ることなしにゴール地点まで到達できるか? ただし軌道はどのような曲線を描いてもよい.
考えたこと
直線距離で進まない方が最適なパターンがあるかもしれない,という思考にとらわれすぎて時間を浪費してしまった.
障害物(円)がない場合の最短到達時刻はなので,この時刻の時点でいずれかの円の内部(または周)に入ってしまう場合(あるでとなる場合)は不可能.
意外なのは,そうでない場合必ず到達可能であるということだ.線分上に任意に点をとると,この点を通過した時刻はである.このとき,三角形に対して
が成り立つ.この時点での円の半径はであるから,上の不等式は点を通過した時刻において任意の円の外側にあることを意味する.
したがって,到達可能であるための必要十分条件は任意のに対しとなることである.実装においては不等式の両辺を2乗して整数のまま比較すると正確.
提出:https://codeforces.com/contest/2002/submission/275835959
D1 - DFS Checker (Easy Version)
コンテスト中に解き切ることはできなかったものの,終了後に自力で通したのでこちらについても取り上げる.
問題概要
の番号が付いた頂点の完全二分木(頂点の子はと)と,の順列が与えられる.以下の個のクエリを処理せよ.
x y:の番目の要素と番目の要素をswapし,がこの二分木のDFS順として正しいかどうかを出力する.
考えたこと
が与えられた二分木のDFS順として正しいかどうかを判定する代わりに,DFS順(のひとつ)がになるような二分木が,与えられた二分木と同型かを判定することにする.
クエリを処理する前に,あらかじめDFS順がになるような二分木を陽に構築し,隣接リストgraphと親のリストparをもっておく.また,
- :頂点の親は与えられた二分木と同じか
を前計算しておく.これは,各頂点に対してかどうか(に親がないなら,かどうか)をチェックすることでできる.
あとは,クエリごとにp, graph, par, validを差分更新し,その都度すべてのに対しがtrueかどうかを判定すればよい.頂点のswapで影響を受ける頂点は高々8個(およびその親と子)なので,計算量はクエリ数に対して線形である.
提出:https://codeforces.com/contest/2002/submission/275852278
雑感
全体的に問題がARCっぽい! 苦手!!
今までARCを避けてきたので瞬発力の低さが如実に表れてしまったなあ……という3時間だった.悔しいのでまた参加したい.