競技プログラミング日記

主に AtCoder の記事です

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

AtCoder Beginner Contest 287 参加

ABC287 A~Dの1000点. D問題先頭から調べるのと末尾から調べるのは, 同様の操作になるので関数化できる. \(s[0,i+1)\) と \(t[0,i+1)\) がマッチするのは, \(s[0,i)\) と \(t[0,i)\) がマッチするかつ \(s[i] = t[i]\) または \(s[i] = ?\) または \(t[i]…

AtCoder Beginner Contest 286 参加

ABC286 ABC286受験結果 A~E の1500点STLを使えば実装はもう少し早かった. C問題操作が複数与えられた場合は,順序を変えるとどうなるかを考えると役立つケースが多い. 今回は最適解として, Rotateを何回か \(\rightarrow\) 置き換えを何回か の形のものが…

AtCoder Regular Contest 135B

ARC135B まず,漸化式に出てくる項を減らしたい. \(a_{i} \geq 0\) の条件を無視する. \(S_{i}, S_{i+1}\) の変化を調べると, \(a_{i}, a_{i+3}\)だけが異なり,\(a_{i+1}, a_{i+2}\) は共通している. 式 \(-a_{i} + a_{i+3} = - S_{i} + S_{i+3}\) を得…

AtCoder Regular Contest 134B

ARC134B 貪欲法. アルファベット順の小さいほうから試す 右側から優先して選ぶ 左側からも優先して選ぶ 左,右から選ぶindexを\(l, r\) とすると, 常に \(l \leq r \) である. このことに注意すると, \(O(N)\) で実装できる. 使っている記号,マクロ等 …

AtCoder Regular Contest 133B

ARC133B 拡張したLIS.類題: 問題:ARC126B, 記事実装 \(P\) のindex を回した方が楽. 倍数判定なので,エラトステネスの篩と同様にできるため. \(Q\) のindex を回すと,約数を列挙しないといけないとので, \(O(N^{\frac{1}{2}})\) が余分にかかる. 使っ…

AtCoder Regular Contest 122B

ARC122B \(x \in \mathbb{R}\) であるから,範囲を狭くしたい. min を外すため,大小で場合分けする. 場合分けの境目の値が候補になりそうで, 実際にそうなる. これで候補が \(N\) 個に絞れたので全探索できる. 実装\(a\) の中に同じ値が複数ある場合に…

AtCoder Regular Contest 124B

ARC124B 2つのvector に対して,次は同値. ある並べ替えで一致 multiset として一致 ソートしたvectors が一致 よって, \(x\) を固定したとき, \([a_{i} \oplus x ]_{i \in N}, \ b\) が multiset として一致していれば良い. \(x\) の候補は \(a_{0} \op…

AtCoder Regular Contest 120B

ARC120B \(k\) を固定する. \(k = i+ j\)となる (\(i,j\)) の組は同じ色で塗るのが必要. 逆に十分であることもよい.例えば,以下の様にグリッドを類別する. 0から8まで移動するとき, パスによらず 0から8のマスをそれぞれ一度ずつ通る.0 1 2 3 4 5 1 2…

第三回 アルゴリズム実技検定 D問題

PAST003D 出力1をコピーすれば, \(0, \cdots, 9\) に対応するchar たちが分かる. 使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925" int main() { vector<string> t = { ".###..#..###.###.#.#.###.###.###.###.###.", ".#.#.#</string>…

第三回 アルゴリズム実技検定 F問題

PAST003F 回文は,外から決めるか内から決めるかのどちらかが基本. 今回は外から決めることにするが,どちらでも可能. \(a_{i}\) と \(a_{n-1-i}\) に共通の文字があればそれを使う, なければ回文が作れない これを \(i\) について貪欲に決めていく. 今…

第三回 アルゴリズム実技検定 G問題

PAST003G 問題文に金移動とあり将棋の金のような動きだが,移動方法はあまり重要ではなく,基本はBFS. ただし,そのままやると無限に広がるグリッドなので無限ループに入ってしまう. そこで,グリッドの範囲を狭くすることを考える. 遠くに行き過ぎるメリ…

第三回 アルゴリズム実技検定 H問題

PAST003H 座標 \(i\) にいるとき,次に取るべき行動は, 今までの行動とは無関係に選べる. つまり,時刻だけが重要で今までの選択は無関係なので, 状態をまとめることができ,これはDPで実現可能. 実装ジャンプ中にゴールするときだけ注意. 問題文にも書…

第三回 アルゴリズム実技検定 I問題

PAST003I 転置のクエリだけが時間がかかるので,そこを何とかする. 転置は2回繰り返すともとに戻るので,回数だけ記録しておく. また,行と列は独立に操作可能. 使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925" int…

第三回 アルゴリズム実技検定 J問題

PAST003J LISに近い問題. 実験してみると,子供 \(i \in N\) が食べた最大の寿司を \(v_{i}\) とおくと, \(v\) は常に降順. よって,誰が食べるのかは binary search で求まる. 使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/1…

第三回 アルゴリズム実技検定 K問題

PAST003K データ構造の問題. 愚直に移動を実装していてはTLE. コンテナ毎について, 下に何があるか,上に何があるか を記録しておく. 切れ目とつなぎ目だけ更新すれば良いので \(O(Q)\) 実装今回の問題では,上に何があるかは記録しなくてもよい,また,…

第三回 アルゴリズム実技検定 L問題

PAST003L データ構造を用いたシュミレーションの高速化問題.\(1 \leq a_{i} \leq 2\) と小さいので,そこから考える. 簡単のため, まずは\(a_{i} = 1\) で考える.最大値を高速に求める必要がある. 消費期限はすべて異なるので,set型で実現できる. 最…

AtCoder Beginner Contest 284D

ABC284D \(N = p^{2} q \leq 9*10^{18}\) と \(N\) が大きいが, 素因数の最小値は小さい. (重複を許して)3つの素因数があるので,どれか一つは\(N^{1/3}\) 以下. よって, \(min(p,q)\) のうち,一方は全探索で求まる. \(p,q\) の一方が求まれば,もう一…

第二回 アルゴリズム実技検定 K問題

第二回 アルゴリズム実技検定 K問題 \(O(N^{2})\) は通る. 全探索するとき, \(for \ i \in N\) はこれ以上簡単に出来なさそう. そこで,残りを\(O(N)\) で押さえたい.( を+1, ) を-1 とみる. 計算量を無視して,持っておきたい情報(状態)を考えてみる…

第二回 アルゴリズム実技検定 I問題

第二回 アルゴリズム実技検定 I問題 完全二分木のトーナメントをシュミレーションすれば良い. \(2^{N}\) 人のトーナメントの試合全体は \(2^{N} * 2\) 個程度なのがポイント. 実際,等比数列の和の公式から \(1 + 2 + 4 + \cdots + 2^{N} = 2^{N+1} - 1\)…

第二回 アルゴリズム実技検定 H問題

第二回 アルゴリズム実技検定 H問題 のマスには が書かれていると考える. とする.前処理として, を求めておく. 遷移は : 今のマス : 次のマス に対して全探索すればよい. 2マス間の距離はマンハッタン距離. 使っている記号,マクロ等 "https://ecsmtli…

AtCoder Regular Contest 114B

ARC114B の定義域を に制限したとき 値域が になり単射となる を数え上げる. つまり, の値域と定義域を に制限したときに 全単射となる を数え上げる問題. は functional graph と呼ばれるグラフになる. 連結成分毎にサイクルが一つあり,そこに枝が何本…

AtCoder Regular Contest 106B

ARC106B 連結成分毎に考えてよい. 連結なグラフで考えるとき,まずはtreeで考えるとよい. Spannig treeを用いて,treeの場合に帰着できるケースも多いし, まずtreeで解けないと,一般の場合は話にならない. また,操作の性質として,操作によって値の総…

AtCoder Regular Contest 108B

ARC108B fox の文字が全て異なっているので楽. s を先頭から調べていき,スタックに積んでいく. スタックの方で後ろ3文字がfoxになったら消せばよい. O(N)で解ける. 実装は,スタックでなくvector で行った. 使っている記号,マクロ等 "https://ecsmtli…

AtCoder Regular Contest 109B

ARC109B まででなく, と が入っているのが気になる. まず,丸太の買い方として,同じ値段なら長いほうが得. 言い換えると,短いほうで出来るなら,長いほうでも出来る, いわば上位互換. 上位互換の考えは,貪欲法を示すときによく使う. 大きい方から買…

AtCoder Regular Contest 110B

ARC110B 110をブロックと考えて分割する. 個のブロックに分ける. 実装を簡単にするため,110のブロックを 個並べた文字列 を用意する. のとき, の最初の3文字によって場合分けして考える. の形も,同じ形の繰り返しになり,最後に余った部分が出てくる…

AtCoder Regular Contest 111B

ARC111B カードの表裏に書かれた数字を頂点として,カードを辺とみなしたグラフを考える.カードの表裏を選ぶ事は,辺に向きを付けることとみなす. 連結成分毎に考えればよい. 連結成分をtreeの場合を先に解いて,そうで無い場合はtree に帰着させる. 連…

AtCoder Beginner Contest 282E

ABC282E ボールを頂点としてグラフを考える. 辺にコスト をつける.辺 を選んで を戻すという操作により, に を対応させる.操作は 回で終わる. 有限グラフであることから,サイクルはない. よって,操作で選んだ辺全体は木になる.あとは,最大コストに…

AtCoder Beginner Contest 270D

ABC270Dmin-max法.まず,簡単な問題を考える.何個取れるのかは無視して, 先手が必勝か必敗か引き分けかを判定する. 先に判定問題を解いて,それを改良する手法はよくある.判定問題 := (先手の取った石の個数) - (後手の取った石の個数)を考える. 最善…

AtCoder Regular Contest 126B

ARC126一般化したLIS.LIS まず普通のLISを考える. vector に対して,連続するとは限らない部分列であって 狭義単調増加になるもののうち,最長の長さを求める問題. 増加列は2つの図形的な捉え方がある. 一つ目は,の組を頂点として2次元平面に図示すれば…