競技プログラミング日記

主に AtCoder の記事です

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

AtCoder Beginner Contest 262E

ABC262E 赤い頂点 \(v\) の内,\(deg_{v} \equiv 1 \ mod \ 2\) のもの全体を \(X\) とおく.場合分けして数える. \(X\) がら丁度 \(i\) 個 (\(i \in [0,N]\)かつ\(i \equiv 0 \ mod\ 2\)) 選ぶ場合の数の合計が答え. 使っている記号,マクロ等 "https://e…

AtCoder Beginner Contest 263E

ABC263E 期待値DP. \(i \in N\) に対する答えを \(dp_{i}\) とおく. 遷移は\(dp_{i} = \frac{1}{a[i]+1} \sum_{x \in a[i]+1} dp_{i + x} + 1\).よって,\(dp_{i} = \frac{1}{a[i]} \sum_{x \in [1, a[i]+1) } dp_{i + x} + \frac{a[i]+1}{a[i]}\).初期値…

AtCoder Beginner Contest 266E

ABC266E 期待値DP. 素直に考えると再帰になる. 再帰で考えた後に,高速化として for などが可能か考えればよい. 最初から綺麗に書こうとしない方が楽. 残り \(x\) ターンのときの答えを \(f(x)\) とおく.\(f(x) = \sum_{d \in [1,6]} \frac{1}{6} max(d,…

AtCoder Beginner Contest 265E

ABC265E 移動したときに出てくる座標が少ない事がポイント. ただし,map を使って座標を記録すると重いので, 移動回数を状態に持ちながら dp. 解法0: DP\(dp_{i,s,t} := \) \(i\) 回移動して,そのうち タイプ \(0\)の移動を \(s\) 回, タイプ \(1\)の移…

AtCoder Beginner Contest 264E

ABC264E Union-find, クエリ先読み,クエリの逆算. 切断するのは難しいが,結合するのは Union-find を用いれば簡単. クエリを先読みして,逆算すれば結合に書き換えられる. 実装\(M\) 個の発電所は,役割がすべて同じなので区別する必要がない. よって…

AtCoder Beginner Contest 267E

ABC267E 最大値の最小化は, binary search が典型. しかし,解法から攻めるのは王道とは言えない. まずは性質を考える. 単調性 \(\cdots (*)\)取り除く作業を繰り返してく. ある時点でコスト \(y\) 以下の vertex は,それ以降もずっと コストが \(y\) …

AtCoder Beginner Contest 269E

インタラクティブな問題. 解法Binary search と同じで,区間を半分ずつにしていく. 行を 2つの区間に分けたとき,区間の行の個数より駒が少ない区間が存在する. そちらの区間に正解の行がある. 列も同様. 実装入力と出力を一緒に行う関数を用意すると楽…

AtCoder Beginner Contest 270E

ABC270E 解法は2つある. いずれにせよ,まずは 1周を一塊で考える. 解法0: Binary search\(K\) を固定する.(\(m\) 周できるか) \(\in Bool\) は単調.\(m\) 周すると,各 \(i \in N\) に対して \(min(a_{i},m)\) 個食べるので, その合計が \(K\) 以下か…

AtCoder Beginner Contest 271E

ABC271E 通る道の長さの最小を求める.最小の長さの合計ではない. 良いpath良いpath とはどういうものかを考えると, \(E\) を先頭から見ていくことで判定できる. そこで \(E\) を基準に考える.また,良いpath 自体は多くなりうるので,Dijikstra などで …

AtCoder Beginner Contest 273E

ABC273E 永続データ構造.Vector \(a\) 自身でなく,\(a\) の編集履歴を保存しておき, 履歴におけるタイミングに跳ぶことで復元する.今回は tree \(T\) を永続データ構造としてもつ. 出力クエリ必要な情報は,\(a\) の末端.これは \(T\) における頂点 \(…

AtCoder Beginner Contest 280E

ABC280E 普通にDPをしても \(O(N)\) で間に合う. 今回は遷移が線形なので,行列冪乗で遷移を計算すれば \(O(log N)\). 使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925" template<typename T> using M = vector<vector<T>>; template<typename T> M<T> oper</t></typename></vector<t></typename>…

AtCoder Beginner Contest 279E

ABC279E \(0\)-indexed で考える. \(j \in M\) 番目を除いたものは, \([0,j) \) と \([j+1, M)\) に分解すると便利. 累積和などでも使われるが,今回も同様にできる.あみだくじの上の方は,\(0\) の場所だけで十分. 下の方は,\([0, N)\) のすべての位…

AtCoder Beginner Contest 275E

e ABC275E ちょうど \(i \in K+1\) 回で \(j \in N+1\) に居る確率を DP で求める. どの様な手順でその局面に至ったかは,今後に影響しないので, 状態をまとめることが出来てDP可能.遷移に \(O(M)\). 使っている記号,マクロ等 "https://ecsmtlir.hatena…

AtCoder Beginner Contest 274E

ABC274_E 状態ブースターは,取る順序は無関係. よって,どれを取ったかの情報だけで済むので,\(2^{M}\).頂点も,訪れた順序は無関係で, どれを訪れたかの情報だけで十分なので,\(2^{N}\). 原点を含めて,\(2^{N+M+1}\) . 遷移今の頂点と次の頂点を用…

AtCoder Beginner Contest 308F

ABC308 問題の本質から攻めるのが王道. 商品の個数は重要ではなく,大事なのはクーポン. まずはクーポンを全探索する方針で考える. つまり,クーポンを 1枚固定して考える.払う値段は, \begin{align} & \sum_{i \in N} (p_{i} - c_{i}d_{i} )\\ = & \su…

AtCoder Beginner Contest 308E

ABC308E 動く物が 3つある場合, 真ん中を全探索する のは典型.\(E\) の場所を全探索して,\(M\) と \(X\) の場所を考える. \(M,X\) それぞれの値に対して,それが何個取り方があるのかを数える. 用意したいもの:\(i \in N\) が与えられたとき, \([0,i)…

AtCoder Beginner Contest 308D

文字列 snuke の中に,同じ文字は使われていない. よって,同じマスを通る必要はない. DFS で実装可能. 一般化:もし,文字列 snuke の代わりに,同じ文字が現れる文字列 \(S\) の場合. 訪れたかどうかを,\(x \in H, y \in W, i \in Length(S)\) に対し…

AtCoder Beginner Contest 286E

ABC290E Warshall-Floyd. \(O(N^{3})\) が間に合う.(最短距離,お土産の最大化) の優先順位で同時に処理する. つまり,辞書順を用いればよく,pair を使えばよい. 最大化の方は,マイナスをつければ最小化に帰着できる.実装パスの頂点すべてでお土産を買…

AtCoder Beginner Contest 287E

ABC287E LCPに関する問題.先頭から貪欲に考えるのが基本.Binary Trie に近い.とりあえず,\(n\) 個は多いので 2つで考える. 2つの文字列 \(s,t \) の LCP は,先頭から貪欲に調べれば求まる.次に複数の文字列を同時に判定することを考える. これは tre…

AtCoder Beginner Contest 284E

ABC284E Simple path の個数DFS で求まる.今の頂点 \(cu\) からの遷移が終わった後に, \(vis[cu] = false\) に戻す. 別の path で同じ頂点 \(cu\) に来た場合,区別して数えるから.実装戻り値に答えを入れた. つまり,戻り値に対して \(chmin(cnt, 1e6)…

AtCoder Beginner Contest 285E

ABC285E 素直に dp を考えると,\(dp_{i,j} := \) \([0,i)\) まで見て,最後の休日が \(j\) 日目 のときの min. しかし,これは失敗する. なぜなら,生産性は,今決めている日だけでなく,先の日の割り当て次第で 今日の近傍の生産性が変わってしまうから.…

AtCoder Beginner Contest 288E

ABC288E Key:買うときの値段を決めているのは何か.買う順序によって値段は変わる. しかし,よく見ると,今買うか決めようとしている商品の値段は, 既に何個買ったか だけに依存している. 買う順序や,どれを買ったかの集合には依存しない. 実装:あまり…