【Atcoder】AGC009 B-E简要题解

B.Tournament

连边 a i → i a_i\to i aii, 构成一颗树。

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+1sjB/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+1sjB/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 1z可以表示成 ∑ ( 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 ci1 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} cm(modk1)。则 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 0ci<k(1il),cl>0
  • ∑ c ≤ m \sum c\leq m cm ∑ c ≡ m ( m o d k − 1 ) \sum c\equiv m\pmod {k-1} cm(modk1)
  • l ( k − 1 ) + 1 − ∑ c ≤ n l(k-1)+1-\sum c\leq n l(k1)+1cn l ( k − 1 ) + 1 − ∑ c ≡ n ( m o d k − 1 ) l(k-1)+1-\sum c\equiv n\pmod{k-1} l(k1)+1cn(modk1)

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的方案数。

你可能感兴趣的:(计数DP,贪心,atcoder)