连边 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)。
真的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)
转化一下问题:
类似于点分治,给每个点根据它在点分树中的深度赋值 a i a_i ai,问题转化为:
使两个权值相等的点的路径上有一个点的权值大于它们的权值,最小化最大的权值。
答案上界即点分树的深度即 log n \log n logn。
那么可以直接存下每个点下面每个权值的访问次数,然后选贪心取最小的使子树合法的权值。
需要发现性质的神仙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):
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的方案数。