目次
AtCoder Beginner Contest 447 E,F,G問題メモ
E - Divide Graph
問題文
- $N$ 頂点 $M$ 辺からなる単純連結無向グラフ $G$ が与えられます。
- 各辺には コスト とよばれる値が定められており、辺 $i$ のコストは $2^i$ です。
- あなたは今から、$G$ の連結成分の個数がちょうど $2$ になるように、$G$ の辺のうちいくつかを選んで削除します。
- 削除する辺のコストの和としてありうる最小値を $998244353$ で割った余りを求めてください。
- $998244353$ で割った余りを最小化するのではないことに注意してください。
制約
- $2\leq N \leq 2\times 10^5$
- $N-1\leq M \leq \min\left(\frac{N(N-1)}{2}, 2\times 10^5\right)$
- $1\leq U_i \lt V_i \leq N$
- $i\neq j$ ならば $(U_i, V_i) \neq (U_j, V_j)$
- $G$ は連結
- 入力は全て整数
解法
コストが特殊で、辺 $i$ を消すより、$1~i-1$ の全てを消す方が必ず安い。
「辺 $i$ を残すことで、辺 $i-1,i-2,...$ など複数の辺を消さなければならない」ことになったとしても、
辺 $i$ の1本を消さずに残す方がよいということである。
よって、$i$ が大きい方から、残せる限り(残したら連結成分が1つになってしまわない限り)貪欲に残すのがよい。
DSU等を用いて、バラバラの $N$ 頂点をマージしていくことを考える。
$i$ が大きい辺から、連結成分が2個になるまで($N-2$ 回、異なる連結成分をマージするまで)マージしていく。
それまでの辺は全て残せる。
それより小さい $i$ については、既に同じ連結成分に含まれる2頂点を結ぶものなら、残してよい。
残された2個の連結成分を結ぶものであれば消す必要があるので、$2^i$ をコストに加算する。
F - Centipede Graph
問題文
- 頂点に $1$ から $N$ の番号がついた $N$ 頂点の木 $T$ が与えられます。
- 正整数 $k$ について「長さ $k$ のムカデグラフ」を以下の手順で得られる頂点数 $3k$ のグラフと定義します。
- 頂点数 $k$ のパスグラフを用意する。
- そのパスグラフの各頂点 $v$ に対して、$v$ のみに隣接する $2$ つの頂点を新たに追加する。
- 例えば、長さ $4$ のムカデグラフは下図のようになります。
○ ○ ○ ○ │ │ │ │ ○─○─○─○ │ │ │ │ ○ ○ ○ ○
- 木 $T$ の部分グラフとして含まれる「長さ $x$ のムカデグラフ」のうち、最大の $x$ を求めて下さい。
- $Q$ 個のテストケースが与えられるので、それぞれについて答えを求めてください。
制約
- $1 \le Q$
- $3 \le N \le 2 \times 10^5$
- $1 \le A_i, B_i \le N$
- 与えられるグラフは木
- 全てのテストケースにおける $N$ の総和は $2 \times 10^5$ 以下
- 入力される値は全て整数
解法
$N \ge 3$ より、長さ $1$ のムカデグラフは必ず作れる。(これがコーナーで、気付くのに時間かかった)
○--○--○ ←N >= 3 ならこの部分グラフは必ず含まれる
長さ $2$ 以上を考える。
長さ $2$ 以上のパスグラフに対して、
そこに足を生やしたムカデグラフが木に含まれるかどうかは、頂点の次数で判定できる。
パスグラフの各頂点の次数を順に並べたものが $(3以上,4以上,4以上,...,4以上,3以上)$ ならよい。
木から、次数がこのようになる最長のパスグラフを見つければよい。
以下、単に「パスグラフ」と言ったとき、次数の条件を満たすもののみを指すとする。
適当な頂点を根として、木DPをおこなう。
- $\mathrm{DP}[v]:=v$ から親に向かう辺で、継続中の最長のパスグラフの長さ
また、$Ans=1$ で初期化し、木DPの途中で確定したものでMaxを更新していく。
頂点 $v$ の次数を $d_v$、頂点 $v$ の子の集合を $C_v$ で表す。
$d_v \lt 3$ の時、$v$ がパスグラフの一員となることはない。$\mathrm{DP}[v]=0$ である。
$d_v = 3$ の時、
- $v$ で終わるパスグラフが確定できる。$\max_{u \in C_v}\mathrm{DP}[u]+1$ で $Ans$ を更新する。
- $v$ からパスグラフを開始できる。$\mathrm{DP}[v]=1$ とする。
$d_v \ge 4$ の時、
- $v$ を中継点として、2つの子のパスグラフをマージし、確定できる。
- $\{u \in C_v|\mathrm{DP}[u]\}$ の上位2つを $x,y$ として、$x+y+1$ で $Ans$ を更新する。
- 1つの子から続くパスグラフを親に継承できる。
- $\mathrm{DP}[v]=\max_{u \in C_v}\mathrm{DP}[u]+1$
これで、最長のパスグラフが $Ans$ に記録される。
G - Div. 1 & Div. 2
問題文
- すぬけくんは、主催するプログラミングコンテストに用いる問題の選定をしています。
- $N$ 個の問題案があり、問題案 $i$ の 難易度 は $i$、ジャンル は $K_i$、面白さ は $A_i$ です。
- すぬけくんは以下の制約の上で6問を選定します。
- 問題案の中から $6$ つの問題案を選ぶ。選ぶ問題案の番号を昇順に $i_1,i_2,\dots,i_6$ とする。
- $K_{i_1},K_{i_2},K_{i_3},K_{i_4}$ は相異なる必要がある。
- $K_{i_3},K_{i_4},K_{i_5},K_{i_6}$ は相異なる必要がある。
- 条件を満たすような $6$ 問の選び方が存在するか判定し、存在する場合は選ぶ $6$ 問の面白さの総和の最大値を求めてください。
制約
- $6\leq N \leq 10^5$
- $1\leq K_i \leq N$
- $1\leq A_i \leq 10^9$
- 入力は全て整数
解法
天下り的だが、$i_4=p$ を固定することを考える。
仮にDiv.1のことだけ考えると、
- $p$ より左の、ジャンルが相異なる $A_i$ 上位4つ
- $p$ より右の、ジャンルが相異なる $A_i$ 上位4つ
の情報があれば、左から1問、右から2問の選び方を全探索すれば、必ず最適解が構築できる。
左右、あるいは $K_p$ とジャンルが被ってしまう可能性があるので
上位4つまでは保持する必要があるが、逆に5位以下の $A_i$ は使われることが無い。
ここにDiv.2に使う $i_1,i_2$ も入れ込みたい。
左側を、問題単体では無く「ジャンルが相異なる $i_1~i_3$ 3問セットの上位4つ」みたいにすればよさそうだが、、、
3問セットで採用するジャンルはいずれも4問目の $K_p$ とジャンルが被ってはいけない。
もしその条件を満たした上で
「$K_{i_3}$ に使ったジャンルが相異なる、$A_{i_1}+A_{i_2}+A_{i_3}$ の上位4つ」があれば、
左から3問セットを1個、右から2問の選び方を全探索すれば、必ず最適解が構築できる。
言葉では分かりづらいので、以下でちゃんと定義すると、
- 左側
- $M_{p}(x):=$「以下を全て満たす $i_1,i_2,i_3$ の中で、$A_{i_1}+A_{i_2}+A_{i_3}$ の最大値」
- $i_3 \lt p$
- $K_{i_3}=x$
- $K_{i_1} \neq K_{p},K_{i_2} \neq K_{p}$
- $x$ が相異なるような $M_{p}(x)$ の大きい方から $4$ つ
- この4要素の組を $L_p$ とする
- 右側
- $p \lt i$ の中で、$K_i$ が相異なるような $A_i$ の大きい方から $4$ つ
- この4要素の組を $R_p$ とする
i 1 2 3 4 5 6 [7] 8 9 10 11
K 1 3 2 1 4 3 [4] 5 2 5 4
A 9 4 3 5 6 3 [1] 7 2 4 8
i4=7 の時、 内訳(保持する必要は無い)
保持する情報 (i1,i2,i3) (Ki1,Ki2,Ki3) (Ai1,Ai2,Ai3)
Lp: (x=4, スコア=19) ... ( 1, 2, 5) ( 1, 3, 4) ( 9, 4, 6)
(x=2, スコア=16) ... ( 1, 2, 3) ( 1, 3, 2) ( 9, 4, 3)
(x=3, スコア=15) ... ( 1, 3, 6) ( 1, 2, 3) ( 9, 3, 3)
(x=1, スコア=12) ... ( 2, 3, 4) ( 3, 2, 1) ( 4, 3, 5)
Rp: (K=4, スコア= 8)
(K=5, スコア= 7)
(K=2, スコア= 2)
(---, スコア=-∞) ←4種類無い時は -∞とでもしておく
Ki1,Ki2 は Ki4 と被ってはいけない点に注意。
後述での計算の都合上、Ki3 は被ってもよいとする。
こうすると、$L_p$ と $R_p$ の組を全探索して、 「$x,K_{p},K_{i_5},K_{i_6}$ が互いに相異なるような組での $M_p(x)+A_p+A_{i_5}+A_{i_6}$ の最大値」が、 $i_4=p$ に固定した時の答えとなる。
上例の場合、Kp=4 は使えないので、 Lpからは x=3, Rpからは K=5,2 を選んで、15 + 1 + 7 + 2 = 25 が最大値 i 1 2 3 4 5 6 [7] 8 9 10 11 K 1 3 2 1 4 3 [4] 5 2 5 4 A 9 4 3 5 6 3 [1] 7 2 4 8 ~ ~ ~ ~ ~ ~
後は、$L_p,R_p$ の求め方である。
$R_p$ は特に難しくないが、$L_p$ が難しい。
以下を $i=1,2,...,N$ について前計算しておく。
- $S_i:=i$ より左の要素でジャンルが相異なる問題の面白さ上位4つ
- $T_i:=$「$i_3=i$」とした時に、$i_1,i_2$ を適切に決めることで達成できる3要素の面白さの最大値
- $U_i:=T_i$ を決めるとき、$i_1,i_2$ として使用したジャンルのペア
- $V_k:=U_i$ の逆対応。ジャンル $k$ が $U_i$ として使われているような $i$ のリスト
$T_i$ は $S_i$ より計算できる。またその時 $U_i,V_k$ も求められる。
$L_p$ は、基本的には「$i \lt p$ かつジャンル $K_i$ が相異なるような $i$ の中での $T_i$ 上位4つ」なのだが、 ただし $V_{K_p}$ に含まれるような $i$ については、ジャンルが $K_p$ と被るため $T_i$ をそのまま使うことはできない。 「$i_1,i_2$ にジャンル $K_p$ のものを使っていない中での」次善の最大値 $T'_i$ に変更する必要がある。
ここで、$S_i$ が上位4つまでを保持していることで $T'_i$ も、$p$ に応じて $S_i$ から求めることができる。
$T_i$ をセグ木に載せ、$T'_i$ に変更しなければならない箇所だけ変更した上で $[0,p)$ を集約すれば、$L_p$ が求められる。
(ジャンルが被らないように上位4つを保持するセグ木のマージ関数の実装は大変だが、頑張る)
まとめると、
- 処理順は、まずジャンルでグループ分けする。
- $c=K_p$ であるような全ての $p$ についての答えを求めた後、次の $c$ を処理していく。
- 各 $c$ について、以下のように処理する。
- $V_c$ にあるような $i$ について、$c$ を使わない次善の $T'_i$ を計算し、セグ木を更新する。
- $c=K_p$ であるような $p$ について順に、$L_p$ と $R_p$ から $i_4=p$ の場合の答えを得る。
- 全ての $p$ の処理が終わったら、セグ木を $T_i$ に戻す。
- 全体を通してのMAXが答え
となる。

