TUATPC2024Summer (Algorithm)
コンテスト日時
2024/09/26 (Th) 20:00 - 23:00

M - Subtree Flip Path Count

Earlgray
2.5
s
1024
MB
350

問題文

$N$ 頂点の根付き木 $T$ が与えられます。

頂点には $1, 2, \dots, N$ の番号が付けられており、頂点 $1$ が根です。
頂点 $i$ は重み $V_i \in \lbrace 0, 1 \rbrace$ を持ちます。また、辺には $1, 2, \dots, N - 1$ の番号が付けられており、辺 $i$ は頂点 $A_i, B_i$ を結んでいます。

$T$ 上のパスの重みを、パス上に現れる頂点の重みの総和と定義します。また、パスの長さを、パス上に現れる辺の本数と定義します。

根付き木 $G$ に対し、$f(G)$ を $G$ に含まれる重み長さが共に偶数であるパスの個数と定義します。

$f(T)$ を求めてください。続けて、$i = 1, \dots, N$ について次の問題を解いてください。

$T$ について、頂点 $i$ を根とする部分木に含まれるすべての頂点(頂点 $i$ も含む)から成る集合を $S_i$ とする。

$j \in S_i$ について、$V_j$ を $1 - V_j$ に置き換えた後の木を $T_i$ とする。$f(T_i)$ を求めよ。

制約

Final (100点)

  • $1 \le N \le 10^5$
  • $V_i \in \lbrace 0, 1 \rbrace$
  • $1 \le A_i < B_i \le N$
  • $T$ は木
  • 入力はすべて整数

Hard (50点)

  • Final の制約に以下の制約を追加
  • $1 \le N \le 2000$

Normal (75点)

  • Final の制約に以下の制約を追加
  • $1 \le N \le 1023$
  • $n$ を正整数としたとき、$N = 2^n - 1$
  • $A_i = \left\lfloor\frac{i + 1}{2}\right\rfloor, B_i = i + 1$ (ただし $\left\lfloor x\right\rfloor$ は $x$ を超えない最大の整数)

Easy (125点)

  • Final の制約に以下の制約を追加
  • $1 \le N \le 127$
  • $n$ を正整数としたとき、$N = 2^n - 1$
  • $A_i = \left\lfloor\frac{i + 1}{2}\right\rfloor, B_i = i + 1$ (ただし $\left\lfloor x\right\rfloor$ は $x$ を超えない最大の整数)
部分点のみ解答したい場合

部分点のみを解答したい場合、問題によっては結果が TLE となるケースが大量に発生し、ジャッジに時間がかかる可能性があります。

C++の assert 関数やPythonの assert 文などを用いて、変数の値によってプログラムを強制終了させる処理を書き加えることで TLE を防ぎ、より早く結果を得ることができます。

入力

入力は以下の形式で標準入力から与えられます。

$N$
$V_1 \ \ \dots \ \ V_N$
$A_1 \ \ B_1$
$\ \vdots$
$A_{N - 1} \ \ B_{N - 1}$

出力

$N + 1$ 行出力してください。
$1$ 行目には、$f(T)$ の値を出力してください。
$i + 1$ 行目には、$i = 1, \dots, N$ の問題の答えを出力してください。

入力例 1
7 1 0 1 0 1 0 0 1 2 1 3 2 4 2 5 3 6 3 7
出力例 1
10 8 9 9 9 13 9 9

$T$ は次のようになります。黒い数字が頂点番号、赤い数字が各頂点の重みを表しています。

例えば、頂点 $1$ と頂点 $5$ を結ぶパス $(1, 2, 5)$ や、頂点 $4$ と頂点 $7$ を結ぶパス $(4, 2, 1, 3, 7)$ は重みと長さが共に偶数です。
$T$ にはこのようなパスが全部で $10$ 個あるので、$1$ 行目に出力するべき値は $f(T) = 10$ です。

$3$ 行目について、頂点 $2$ を根とする部分木に含まれるすべての頂点の重みを置き替えた後の木 $T_2$ は次のようになります。
$T$ から置き替わった重みを青い数字で表しています。

$T_2$ には重みと長さが共に偶数であるパスが $9$ 個あるので、$3$ 行目に出力するべき値は $f(T_2) = 9$ です。

$8$ 行目について、頂点 $7$ を根とする部分木に含まれるすべての頂点の重みを置き替えた後の木 $T_7$ は次のようになります。

$T_7$ には重みと長さが共に偶数であるパスが $9$ 個あるので、$8$ 行目に出力するべき値は $f(T_7) = 9$ です。

この入出力例は Easy・Normal・Hard・Final の制約を満たします。
Easy・Normal では $T$ はこのような「完全二分木」が与えられることに注意してください。

入力例 2
7 1 0 0 1 0 1 0 1 2 1 3 2 4 2 5 2 6 3 7
出力例 2
9 9 11 8 8 12 8 8

$T$ は次のようになります。

この入出力例は Hard・Final の制約を満たします。

提出
C++23 (g++ 12.2.0)