競技プログラミング日記

主に AtCoder の記事です

2023-08-01から1ヶ月間の記事一覧

AtCoder Beginner Contest 264F

ABC317F 制約から,\(O(HW)\) は間に合う. よって,今いるマスを全探索は可能なので, それで DP を考える. 追加で持っておきたい情報として, 今いる行と列が,それぞれ flip しているか \(in 2 \times 2\) がある. 今居るマスと flip の情報で十分であ…

AtCoder Beginner Contest 317E

ABC317E 実装が少し面倒だが,ただの BFS. 前処理として,通れないマス全体を求めておくと楽. それさえ出来ていれば,グリッドに対する BFS をするだけ. 実装例: 公式解説の方法を載せる. 通れない頂点は,BFS で既に調べた頂点として初期化しておけばよ…

AtCoder Beginner Contest 317D

ABC317D 計算量を見ると,\(O(N * sum(Z))\) は間に合う. ここから DP を考えるというよりは,まずは自然に考える. 簡単に思いつくのは,\(i\) を固定したときの様子を探ること. \(i \in N\) を固定したとき何人を鞍替えさせれば良いかを考える. 鞍替え…

AtCoder Beginner Contest 317C

ec ABC317C 解法1: BitDP ハミルトン閉路と同様に, 状態 \(\,(s,v)\,\) の 2つ を持って遷移. ここで,\(s \in 2^{N}\) は訪れた頂点の集合, \(v \in s\) は最後に訪れた頂点. 試験中はこの方針で考えていた. しかし,\(s\) しか状態に持っていなかった…

AtCoder Beginner Contest 245F

ABC245F サイクルに到達出来る頂点の個数を求める. そうでない,無駄な頂点を省いていく. 具体的にサイクルを求めたりする必要はなく, 出次数が 1以上の頂点だけ通り続ければサイクルになる. 出次数が 0の頂点 \(v\) に到達しても,サイクルには到達でき…

AtCoder Beginner Contest 257F

\( \def \ra {\rightarrow} \) ABC257F テレポータの行き先を超頂点 \(X \not\in N\) とおく. \(X\) を頂点として加えたグラフを考える. これにより,テレポータの行き先を保留した状態でグラフを構成できる. \(X\) の行き先を \(i\) としたいときは, コ…

AtCoder Beginner Contest 252F

ABC252F 切り方は tree に対応する. つまり,最適な切り方を探すのは,最適な tree を探すことに対応する. しかし,tree 全体は探索しても間に合わない. Tree の葉に値を割り振って,parent に child の値を足していくと考える. すると,葉を除いた頂点…

AtCoder Beginner Contest 248F

ABC248F 状態をまとめて DP. 連結しているかどうかが重要. 今 i番目の コ の字の部分を決めようとしているとする. つまり,左側は既に決まっているとする. 上の頂点と下の頂点が,左側において連結しているかどうかだけが, 今後に影響する. \(dp_{i,k}…

AtCoder Beginner Contest 254F

ABC254F 長方形領域における GCD を求める問題. 2次元の計算を 1次元に落とす. 気持ちとしては,和や差によって GCD が変わらないことを利用して, 左上を基準のマスとして,残りは差分で計算したい. 行と列の差分を別々に計算することで,計算量を減らす…

AtCoder Beginner Contest 315F

ABC315F スキップした頂点が多いほどペナルティが大きくなる. スキップできる箇所はそんなに多くないのがポイント. スキップしないで頂点を通った場合,最大で \(2^{1/2} 10^{4}*n \leq 1.5 \cdot 10^{8}\). ペナルティがこれよりも大きい場合,ペナルティ…

AtCoder Beginner Contest 315参加

ABC315参加. 2週間連続でやらかしてレーティングが合計100減った. これなら試験に参加しなければよかったと感じる. ランクが上がったところで気持ちよく終わっていればよかった. 勉強を続けても,試験は受けないほうが精神面でプラスだった. AtCoder の…

AtCoder Beginner Contest 315D

ABC315D あまり綺麗な解法がない.全探索によるシュミレーションを高速化する問題. 基本は, 何を全探索するか. 升目の全探索は,削除の処理を考えると TLE である. たとえば,aaaaabccccbdeeebdfghのような形が最悪ケース. 対策:色が 26種類と少ないこ…

AtCoder Beginner Contest 315E

ABC315E トポロジカルソート. 本問題は DFS, BFS どちらでも可能である. どちらでも良いときは,DFS の方が実装が軽いケースが多い. DFS のトポロジカルソートは,帰りがけ順で vertex を並べて, 最後に reverse. 試験本番では BFS で実装した. どこが…

AtCoder Beginner Contest 241F

ABC241F 大事な座標だけもって BFS. オブジェクトの周囲 4マスだけがグラフの頂点となる. map や upper_bound を使うので,遷移ごとに \(log(V)\) がかかる. ここで \(V\) は vertex の集合のサイズ. 前処理にもソートで \(log V\) が余分にかかる. 遷移…

AtCoder Beginner Contest 237F

ABC237F 制約から,DPで計算するときに 状態 \( O(NM^3) \), 遷移 \( O(M) \) でも間に合う. LIS の求め方を考えると, LIS の 3つの項が \(x,y,z\) のときを状態に持てばよい. 一旦,LIS を無視して考える. 長さ \(N\) の vector \(v\) であって,各元 \…

AtCoder Beginner Contest 236F

ABC236F \(V := (\mathbb{F}_{2}\) における \(N\) 次元ベクトル空間) の基底を求める問題. コストの小さいほうから貪欲に選んでいく. コストを無視すれば,吐き出し法で基底は求まる. \(b\) を 1次独立な vector の集合として,\(V\) を span できるまで…

AtCoder Beginner Contest 232F

ABC232F swap たち全て \(\rightarrow\) abs たち全ての順で操作をしても良い. まず \(n\) 次 permutation \(P\) を固定して, \(P\) に対するコストを求める. Swap of \(P\) の回数は,転倒数で求まる. これに \(y\) を掛けると,swap に対するコストに…

AtCoder Beginner Contest 224F

ABC224F 遷移が線形なので,行列積で書ける. + を置いたときに,+ より左にある項の和を \(t\), 今計算中の項を \(x\) とおく. 遷移は, \(s_{i}\) の直前に + を置く場合:\(t \rightarrow t + x\), \(x \rightarrow s_{i}\), \(1 \rightarrow 1\) となる…

AtCoder Beginner Contest 314E

ABC314E まず,0 の目が出ない様に変換しておく. 0 の個数を \(z\) 個とおく. 0 以外の目が出るまでの回数の期待値は \(\frac{p}{p-z}\) 回. \(c\) を \(c \cdot \frac{p}{p-z}\) で置き換えて,\(z\) を除いたルーレットで考えてよい. \(e_{x}\) を,ス…

AtCoder Beginner Contest 314D

ABC314D 原因不明の WA. 小文字(または大文字)に直す自作の関数でWA. 手元では,テストケースが正しく動いていた. 提出したら,テストケースもWA. 対策std::toupper, std::tolower を用いたら AC. クエリ先読み大文字,小文字の入れ替えを毎回実行したら, …

AtCoder Beginner Contest 214F

ABC214F 最後に使う文字を全探索する. 今 \(i \in N\) 文字目を見ているとする. \(j \leq i\) の範囲を,\(j\) を小さくしながら調べる. 初めて \(s_{j} \neq s_{i}\) となる直前までの \(j\) に対して, \(dp_{i} += dp_{j}\). 実装2文字前からスタート…

AtCoder Beginner Contest 220F

ABC220F 差分の更新で高速化の問題. まず,vertex を一つ固定した場合の答えを求まる. Vertex を 0で考えると,0 を根とした木に対してDFSをすればよい. 根からの距離はDFSの深さで求まる. 次に差分を考える. \(s \rightarrow t\) と vertex を遷移した…

AtCoder Beginner Contest 197F

ABC197F 問題文で与えられたグラフを \(G\) とおく. 解法1: BFS 素直な実装. 頂点が \(N \times N\) のグラフ \(\hat{G}\) を考える. \(\hat{G}\) における 頂点 \(\,(x,y), (nx,ny)\,\) に対する辺は, \(G\) において辺 \(e = (x,y,c), ne = (nx,ny,nc)…

AtCoder Beginner Contest 131F

ABC131F 格子点を2部グラフとして扱う. 点 \(\,(x,y)\,\) が与えられたとき, グラフ \(G\) において 頂点 \(v_{x}, v_{y}\) と 向無辺 \(\,\{v_{x}, v_{y}\}\,\) を作る. 点として現れる \(x\) 座標全体,\(y\) 座標全体を \(a_{x}, a_{y}\) とおく. \(c…

AtCoder Beginner Contest 153F

ABC153F まずは,爆弾を使う座標について考える. ダメージの入る範囲を \([x-d, x+d]\) でなく, \([x', x'+2d]\) と考える. 中途半端な位置で爆弾を使うメリットは無いため, 爆弾を使うときに左端に敵が居ると仮定してよい. 言い換えれば,左端に敵が居…

AtCoder Beginner Contest 154F

ABC154F パスカルの三角形を長方形で書く. \(r\) 行 \(c\) 列が \({}_{r+c}C_{r}\) となる. 長方形領域の和は,左上を\(\,(0,0)\,\) で固定して, 累積和と同様に計算すると良い. パスカルの三角形の性質 \(\sum{r \in [0,R] } f_{r,c} = f_{R,c+1}\) と…

AtCoder Beginner Contest 188E

ABC188E DAG であることを用いる.DP は DAG のときしか使えない. 売る町を全探索する. 町 \(i \in N\) に居るとき, 番号が \(i\) 未満の町は調べ終わっている. とくに,制約から \(i\) にたどり着く path は全て調べ終わっている. よって,それらの pa…

AtCoder Beginner Contest 190F

ABC190F 転倒数,クエリ問題. 毎回愚直に求めると間に合わないので,差分を更新する. \(b\) の先頭を一番後ろに持ってきても, 転倒数を計算するときの処理の大部分は使いまわせる. 先頭からの削除と,後ろへの追加を別々に処理出来れば十分. \(b\) の先…

AtCoder Beginner Contest 189F

ABC189F 漸化式を立てると,一見循環してしまう. これを式変形して循環しない形にして計算する. 振り出しに戻るものが厄介. そのときの答えを \(x\) とおいて, \(x\) に関する 1次式とみなす. \(dp_{i} := i\) に居るときの答え(期待値) とする. \(x =…

AtCoder Beginner Contest 313 参加

ABC313 ABC313 参加. 水色 になって嬉しい!! まぐれでなく,レーティングをあげるために対策をした結果なので, その取り組みも含めて満足した. 具体的には,水色問題の復習をメインにした. 新しく学ぶよりは,すでに解き方を知っている物を, 速く正確に…