探索と最適化アルゴリズムによる競技プログラミング問題の解法

マトリックス操作と深さ優先探索(DFS) 最初の問題は、与えられたバイナリ行列を行の反転と列の置換によって目標の行列に一致させられるかを判定するものです。行の反転は同一の行に対して2回行うと無効になるため、各行に対する操作は「行う」か「行わないか」の二択です。 まず、各行の要素の合計値を見て、反転することが確定している行を処理します。特定の行において ...

8月15日 00:33 投稿

2026年NOI問題解決記録(十五)

コンテストリンク \(\text{著者:DaiRuiChen007}\) A. [UOJ702] 張飛の精鋭兵団 (3.5) 問題リンク コンテストの過程を木として捉え、値を大きい順に埋めていく。制約は親子のトポロジカル順序であり、係数が\(-1\)の層を優先的に埋める。もし埋められない場合は、子ノードが最も多く、勝利回数が最も多いノードを選ぶ。 コードに落とし込むと複雑度を効率的に改善できる。 ...

8月12日 06:48 投稿

ICPC 2025 成都站 8 題解説

A – 絵画の枚数 四捨五入を満たす整数列 b を構成する問題。 条件は各 i に対して round(100·b_i/Σb)=a_i。 これを区間に直すと (2a_i-1)·Σb/200 ≤ b_i < (2a_i+1)·Σb/200。 Σb ≤ 201 であることから、s を 1…201 まで全探索し、各 s に対して貪欲に b_i を決めればよい。 bool build(int n, vector<int> a, vector<int> &out) { for (in ...

8月11日 08:10 投稿

CF996

A link 2つの動物が常に中央に向かってジャンプする場合、中央の間隔が奇数であればもう一方の動物が勝利します(必ず2つの動物が隣り合う状況でアリスがジャンプするから)。偶数の場合、アリスが勝利します(必ず2つの動物が隣り合う状況で相手の動物がジャンプするから)。このように、動物たちは常に中央に向かってジャンプする傾向があります。なぜなら、端に向かって ...

8月9日 10:36 投稿

競技プログラミング問題集の解法解説

問題一覧 A: StringGame (考察) B: SequenceGame (貪欲法+二分探索) C: 猫の世話 (幾何学、考察) D: 数列H (数学) E: キャンディーH (考察) F: エンコーディング1.0 (動的計画法) G: エンコーディング2.0 (深さ優先探索) H: 迷路 (幅優先探索+二点探索) I: レーティング (考察+優先度付きキュー) J: 文字列変換 (総当り) K: 新ゲーム! (計算幾何学+最短経路) A: StringGa ...

8月7日 07:18 投稿

動的プログラミング基礎問題集 - 5つの典型問題と解法

動的プログラミング基礎問題集 ======= 問題1: スキー場の最長滑走ルート 難易度: 入門~中級 解法: メモ化探索 スキー場の地図が与えられ、各地点の標高がわかっています。標高が高い地点から低い地点へのみ滑ることができるとき、最長の滑走ルートの長さを求めてください。 解法として、すべての地点を起点としてDFS(深さ優先探索)を行い、メモ化テクニックを用いて ...

8月5日 17:53 投稿

Codeforces Round 1051 (Div. 2) A~D2問題の解説

A. 全ての長さの減算 思考問題。 長さが \(k(k \in [1,n])\) の区間を選び1を引く操作を繰り返す場合、まず\(a_i = n\) の位置を特定します。次に、\(n\) が存在する区間を維持し、\(n-k+1\) がその両側に存在するか確認し、存在すれば区間を拡張します。存在しない場合は操作は不可能です。 コードを表示``` #include <bits/stdc++.h> using namespace std; using i ...

8月1日 18:57 投稿

eJOI競技プログラミング問題解説

eJOI(European Junior Olympiad in Informatics)の過去問から、いくつかの問題を解説します。 eJOI2017 A - Magic 問題概要 長さ\(n\)の文字列\(a\)が与えられ、使用される文字の種類数を\(|\Sigma|\)とします。部分文字列が「魔法的」であるとは、その部分文字列内に全ての種類の文字が少なくとも1回含まれ、かつ全ての種類の文字の出現回数が等しいことを意味します。 ...

8月1日 00:11 投稿

アルゴリズム競技問題集:動的計画法とデータ構造の応用

問題A:連続要素の除去 この問題では、与えられたシーケンスから連続する重複要素を除去する必要があります。 解法:連続する同じ要素を1つにまとめることで、シーケンスの長さを最小化します。 #include <iostream> #include <vector> using namespace std; typedef long long ll; void process() { int elements; cin >> elements; ...

7月29日 16:55 投稿

洛谷 P1381 単語暗記 問題の解説

問題の説明 霊夢は n 個の単語を覚えたいのですが、一つの文章の一部分を通じてこれらの単語を覚えようとしています。文章は m 個の単語から構成されており、彼女は文章の中から連続した一部分を見つけ出し、その中に含まれる覚えたい単語の数を最大にしたいと考えています(重複する単語は一つとしてカウントします)。そして、覚える単語の数を最大にした上で、選んだ文 ...

7月28日 00:31 投稿