「USACO 2019.12 Platinum」题解

Greedy Pie Eaters

考虑将每个区间对应一个贡献,不存在的贡献为 0 0 即可
那么最后一定恰好吃掉 n n 个派,每只吃掉一个
f l , r f_{l,r} 表示将 [ l , r ] [l,r] 吃完的最大代价
那么枚举中间的一个
f l , r = max l k r ( f l , k 1 + f k + 1 , r + g l , r , k ) f_{l,r}=\max_{l\le k\le r}(f_{l,k-1}+f_{k+1,r}+g_{l,r,k})
g l , r , k = max l a k b r A [ a ] [ b ] g_{l,r,k}=\max_{l\le a\le k\le b\le r}A[a][b]

O ( n 3 ) O(n^3) 区间 D P DP 即可

code

Bessie’s Snow Cow

考虑对于每种颜色用 s e t set 分别维护颜色覆盖的区间
每次插入一段区间后将联通区间并起来
用树状数组维护区间加区间求和
这样复杂度均摊 O ( n l o g n ) O(nlogn)

code

Tree Depth

考虑逆序对 D p Dp 的生成函数
就是 j = 1 n ( i = 1 j 1 x i 1 ) = j = 1 n 1 x j 1 x \prod_{j=1}^n(\sum_{i=1}^{j-1}x^{i-1})=\prod_{j=1}^n\frac{1-x^j}{1-x}

这样可以简单求出 k k 个的方案数
再考虑如何求深度
考虑枚举 j j ,求 j j i i 的贡献
首先 p j = m i n k [ i , j ] ( p k ) p_j=min_{k\in[i,j]}(p_k) 时才有贡献
如果 j < i j<i, 那么 j j i i j j 不会贡献任何一个逆序对
如果 j > i j>i ,那么中间会形成 j i |j-i| 个逆序对
先把中间 j j 的贡献除去,即除以 1 x i j + 1 1 x \frac{1-x^{|i-j|+1}}{1-x} ,再乘上 1 x i j 1或x^{|i-j|}

code

猜你喜欢

转载自blog.csdn.net/qq_42555009/article/details/105700932