神仙场,质量是真的高啊!
Rabbit
好题啊,c 是路径上编号最大的点,所以经过c的路径都应该选上c,然后就可以将树分治了。
然后对于 所有子树 如果有两个点没有都加入标记,就可以和 c 组合,单调链可以卡至 O(n2)。
由于我们每次都是对三个点做标记,考虑可不可以用数据结构优化?
我们可以用标记永久化线段树找当前子树的最大值,预处理一下dfn序,全局查暴力推平即可。
但是观察我们是从子节点往上推的,考虑时间逆流,用并查集维护每一个连通块的最大三元组个数和总大小,未匹配点的个数可以根据前两个信息方便地计算。
具体地,每次加入点的时候把和它相邻的、已经加入了的点合并在一起,构成三的时候必然最大的是中间点,贪心即可。
心跳
神仙题!
先从固定的数组分析它去掉每一个数后,前缀最大值个数的变化。
再从部分分 m=1 开始,尝试构造一个 p 与 a 对应。
将前缀最大值染成红色,备用最大值染上绿色,无用信息染上黄色。这样,我们就将一个 a 序列唯一对应到了一个颜色序列。
然后开始设计关于颜色序列计数的 dp。
至于 m>1,只需要额外记录两个信息:当前红色的个数和是否有不接绿色的红色。