noi前第十三场 题解
A. 钩子
可以发现大概问题是一层一层的。
对于每一层,一定会选完所有长度为 \(2x,2x-1\) 的连续段之后递归下一段。
可以考虑将这样的选择合并在一起考虑,然后做一个 \(dp\)。
可以发现概率的大小大概只与剩下的奇数、偶数段的个数有关,所以记录奇数段的个数就可以转移了。
然后的问题是怎么继续考虑下一层。
比较简单的是奇数段,只要选中间一个点就好了。
对于偶数段,选择两种可能都是可以的。
但是容易发现这样的事情:不同的段之间不会相互影响,相同段的左右两半是对称的。
所以可以钦定这次的选择是偶数段的靠左的中点,在递归结束之后对所有答案按照对称轴取个平均数就好了。
B. 加减
首先写出一个简单的 \(dp\),\(f_{i,j}\) 表示前 \(i\) 个里选了 \(j\) 个的最大收益。
打表之后可以很容易的发现,这个函数是凸的,并且转移也是凸的。
所以可以写个无旋 \(treap\) 合并,然而常数大的飞起。
其实是一个不难的做法,因为函数是凸的,然后进行的操作是取 \(max\),关注的信息也不多。
大概可以想到分治之后进行类似闵可夫斯基和的东西,其实就是差分归并再做一遍前缀和。
C. 树高
大概的思想是,首先把染色点转化为染色与它父亲的边。
然后可以发现,一个染色操作最多造成联通块个数变化 \(1\)。
这也就是说合并的总次数是线性的。
然而显然直接转化并不正确,仔细观察一下。
其实不合法的情况仅当最上面一个点不联通。
可以找到最上面的点,之后的情况会形成一段连续的区间。
对于合并操作,其实一定是父亲与儿子的合并,其实写一个 \(ETT\) 就可以支持这样的交换子树的操作。