B.Tournament
连边 a i → i a_i\to i ai→i, 构成一颗树。
i i i需要在不同层打败他指向的所有选手。
设 f x f_x fx表示 x x x打完所有比赛且为最终的赢家时的子树深度。
递归处理完 x x x指向的所有选手 y y y后,贪心按 f [ y ] f[y] f[y]降序排序得到序列 q q q,从小到大安排到每一层, f [ x ] = m a x ( f [ q [ i ] ] + i ) f[x]=max(f[q[i]]+i) f[x]=max(f[q[i]]+i)。
C.Division into Two
真的zz,DP都多想了一维…
实际上只需要转移一块一块的整体,并维护集合的不断交替。
考虑
d
p
dp
dp:
设
f
[
i
]
[
0
/
1
]
f[i][0/1]
f[i][0/1]表示处理到第
i
i
i位,
S
i
S_i
Si划分到了
A
/
B
A/B
A/B集合,且
S
i
+
1
S_{i+1}
Si+1被划分到另一个集合的方案数,转移:
f
[
i
]
[
0
/
1
]
=
∑
f
[
j
]
[
1
/
0
]
f[i][0/1]=\sum f[j][1/0]
f[i][0/1]=∑f[j][1/0],
[
j
+
1
,
i
]
[j+1,i]
[j+1,i]之间差值
≥
A
/
B
\geq A/B
≥A/B,
s
i
+
1
−
s
j
≥
B
/
A
s_{i+1}-s_j\geq B/A
si+1−sj≥B/A。
[ j + 1 , i ] [j+1,i] [j+1,i]之间差值 ≥ A / B \geq A/B ≥A/B的 j j j是一个 i i i的后缀, s i + 1 − s j ≥ B / A s_{i+1}-s_j\geq B/A si+1−sj≥B/A的 j j j是一个后缀。
前缀和+二分优化,时间复杂度 O ( n log n ) O(n\log n) O(nlogn)
*D.Uninity
转化一下问题:
类似于点分治,给每个点根据它在点分树中的深度赋值
a
i
a_i
ai,问题转化为:
使两个权值相等的点的路径上有一个点的权值大于它们的权值,最小化最大的权值。
答案上界即点分树的深度即 log n \log n logn。
那么可以直接存下每个点下面每个权值的访问次数,然后选贪心取最小的使子树合法的权值。
*E.Eternal Average
需要发现性质的神仙DP:
把问题转成满 K K K叉树,叶子节点中 n n n个值为 0 0 0, m m m个值为 1 1 1,非叶结点的值为它的 K K K个儿子值的平均数。
设 n n n个 0 0 0叶子深度为 x i x_i xi, m m m个 1 1 1叶子深度为 y i y_i yi,根结点值即 ∑ ( 1 k ) y i \sum (\frac{1}{k})^{y_i} ∑(k1)yi。且 ∑ ( 1 k ) y i + ∑ ( 1 k ) x i = 1 \sum (\frac{1}{k})^{y_i}+\sum(\frac{1}{k})^{x_i}=1 ∑(k1)yi+∑(k1)xi=1(考虑叶子全为 1 1 1的情况)
问题转化成了求有多少个数 z z z可以表示成 ∑ ( 1 k ) y i \sum (\frac{1}{k})^{y_i} ∑(k1)yi,且 1 − z 1-z 1−z可以表示成 ∑ ( 1 k ) x i \sum (\frac 1k)^{x_i} ∑(k1)xi。
构造 z z z:
对于 k k k进制小数 z = 0. c 1 c 2 . . . z=0.c_1c_2... z=0.c1c2...(先忽略进位), ∑ c = m \sum c=m ∑c=m,转换成进位前 c i − 1 c_i-1 ci−1, c i + 1 + k c_{i+1}+k ci+1+k,所以 ∑ c ≡ m ( m o d k − 1 ) \sum c\equiv m\pmod {k-1} ∑c≡m(modk−1)。则 z z z满足以下性质(设构造的 z z z小数位长度为 l l l):
- 0 ≤ c i < k ( 1 ≤ i ≤ l ) , c l > 0 0\leq c_i<k(1\leq i\leq l),c_l>0 0≤ci<k(1≤i≤l),cl>0
- ∑ c ≤ m \sum c\leq m ∑c≤m且 ∑ c ≡ m ( m o d k − 1 ) \sum c\equiv m\pmod {k-1} ∑c≡m(modk−1)
- l ( k − 1 ) + 1 − ∑ c ≤ n l(k-1)+1-\sum c\leq n l(k−1)+1−∑c≤n且 l ( k − 1 ) + 1 − ∑ c ≡ n ( m o d k − 1 ) l(k-1)+1-\sum c\equiv n\pmod{k-1} l(k−1)+1−∑c≡n(modk−1)
d p [ i ] [ j ] [ 0 / 1 ] dp[i][j][0/1] dp[i][j][0/1]表示长度为 i i i, ∑ c = j \sum c=j ∑c=j,且末位是否为0的方案数。