CF1172

Codeforces Round #564 (Div. 1)

A

最优情况一定是先打出若干张空白牌后就一直不打空白牌了。设 \(pos_i\)\(i\) 这个数在牌堆中的位置,若一张空白牌都不打就能完成则其为最优,否则答案为 \(\max\limits_{i=1}^n pos_i+n-i+1\),即将一张牌从牌堆移出后又将其移到对应位置上。

还有另一种思路:

\(cnt_i\) 为数字 \(i\) 移到其对应位置的所需次数,\(pos_i<i\) 时,\(cnt_i=pos_i+n-i+1\),否则 \(cnt_i=pos_i-i\)。若存在 \(cnt_i\) 小于当前 \(cnt_i\) 的最大值,说明数字 \(i\) 会回到手牌中,因此将其调整为 \(pos_i+n-i+1\)。这时若最大值发生变化则再调整一轮,最终最大值即为答案。因为答案的上界为 \(2n\),所以最多调整两轮。

B

发现对于 \(x\) 的每个子树,其在圆上一定是连续的一段,不然子树间就会相交。先定一个根节点,发现根节点可以排列其所有子树的顺序,不是根节点的节点可以排列其本身和所有子树的顺序,因此答案为 \(n\prod\limits_{i=1}^n deg_i!\)

C

暴力就是考虑每个数,记录当前操作次数,喜欢的位置选到的次数,考虑的数选到的次数,直接 \(DP\) 即可。

考虑优化,设 \(s\) 为总的权值和,\(s_1\) 为喜欢的位置的权值和,\(s_2\) 为不喜欢的位置的权值和,\(f_v(i,j,k)\)\(i\) 次操作后,当前喜欢的位置的权值和为 \(j\),不喜欢的位置的权值和为 \(k\),某个喜欢的位置的权值 \(v\) 的期望值,\(g_v(i,j,k)\) 为某个不喜欢的位置的权值 \(v\) 的期望值。

\(f_v(i,j,k)=vf_1(i,j,k)\),其可以通过数学归纳法证明,这里对 \(i\) 进行归纳。发现 \(j,k\) 可以用增量的形式表示,即 \(f_v(i+j,s_1+i,s_2-j)\)

转移为:

\[\large\begin{aligned} f_1(i,j)&=\frac{s_1+i-1}{s+i-j}f_1(i+1,j)+\frac{1}{s+i-j}f_2(i+1,j)+\frac{s_2-j}{s+i-j}f_1(i,j+1) \\ &=\frac{s_1+i+1}{s+i-j}f_1(i+1,j)+\frac{s_2-j}{s+i-j}f_1(i,j+1) \\ g_1(i,j)&=\frac{s_2-j-1}{s+i-j}g_1(i,j+1)+\frac{1}{s+i-j}g_0(i,j+1)+\frac{s_1+i}{s+i-j}g_1(i+1,j) \\ &=\frac{s_2-j-1}{s+i-j}g_1(i,j+1)+\frac{s_1+i}{s+i-j}g_1(i+1,j) \end{aligned} \]

得当 \(i+j=m\) 时为边界,\(f_1(i,j)=g_1(i,j)=1\)

D

满足某一行和某一列的要求后,就能把 \(n \times n\) 的问题转化为 \((n-1) \times (n-1)\) 的问题。考虑到第 \(i\) 个时,找到第 \(x\) 行要到第 \(i\) 行,第 \(y\) 列要到第 \(i\) 列,若 \(x,y\) 都等于 \(i\),就不处理,否则放一对传送门 \((x,i),(i,y)\),然后交换第 \(x\) 行和第 \(i\) 行的要求,交换第 \(y\) 列和第 \(i\) 列的要求即可,交换是为了接下来满足 \(i\) 的要求。

E

单独考虑每个颜色的贡献,用总路径数减去不包含某一颜色的路径数即为该颜色的贡献。

若当前考虑到的颜色为 \(c\),将所有颜色为 \(c\) 的点看作白点,其他点为黑点,那么不包含颜色 \(c\) 的路径数就是所有黑色连通块大小的平方。每个黑点向父亲连边,每个黑色连通块最上面都有一个白点,也就是一个白点下面挂着一些黑色连通块。离线后用 \(LCT\) 维护子树大小的平方和,每次在最上面的白点查询变化量即可。

具体来说,初始时整棵树都是黑点,然后用 \(LCT\) 来实现黑白点的变化和查询变化量。处理完当前颜色后,要注意把整棵树再变回都是黑点。

F

题目中的函数可以看作有一个值经过区间后得到一个值,设初始值为 \(x\),那么结果一定能表示为 \(v+sum_{l,r}-xp\),其中 \(sum_{l,r}\) 为区间和,\(x\) 为减去 \(p\) 的次数,因为随着 \(v\) 的增大,\(x\) 不会减小,因此该函数为分段函数。

考虑线段树,在节点上维护 \(c_x\),其为使得在该节点对应的区间 \([l,r]\) 中减去了 \(xp\) 的最小初始值,即为分段函数每一段的端点。

考虑合并信息,用左区间的 \(c_x\) 和右区间的 \(c_y\) 来更新当前区间的 \(c_{x+y}\)。为保证合法,这里要求左区间初始值的最大值 \(c_{x+1}-1\) 经过左区间后要大于 \(c_y\),即 \(c_{x+1}-1+sum_{ls}-xp<c_y\),然后就可以用 \(\max(c_x,c_y-sum_{ls}+xp)\) 来更新 \(c_{x+y}\)

发现 \(c_{x+1}-c_x \geqslant p\),因为 \(c_x\) 经过区间后不可能大于 \(0\),所以至少加 \(p\),才也可能使 \(p\) 的次数变多,得 \(c_{x+1}-1+sum_{ls}-xp\) 具有单调性,可以双指针来做。

询问时就在分段函数上二分即可。

posted @ 2020-10-12 22:30  lhm_liu  阅读(131)  评论(0编辑  收藏  举报