IIIDX新理解

根据题意,我们考虑从小到大枚举树上每个节点,并且让它的值最小。
一组已经确定的值的序列,序列上的每个点都会要求它的子树的值大于等于它。
已经确定的值已经满足条件,所以只需要考虑未被确定的值的限制,也就是要求若干子树(若干dfs序连续段)的值(leq 某个数)
考虑使用二分图完美匹配。
把每个数从大到小排序,并且删除已经被选择的数。
这样子每个点会向一个后缀连边,可以判定二分图完美匹配。
时间复杂度(O(n^5))
然而出题人并没给这个部分分。
考虑hall定理。容易发现这么两个引理。
引理1:把所有点连向的后缀按照长度从小到大排序,钦定长度相同的点一起选可以正确的判定。
引理2:如果选择了长度为(l)的后缀,则同时选择长度(leq l)的后缀判定答案不变。
可以直接按照这两个引理判定,一次时间复杂度(O(n)),总时间复杂度(O(n^3))
发现可以二分,时间复杂度降低到(O(n^2log_2n))
实际上,每个限制后缀(设长度为(l))都要求长度比它小的前缀的权值和>l。
移项可以得到限制和(-)比他小的前缀的权值和(>0)
我们需要一个数据结构支持快速查找([1...x])权值(>0)的前缀的长度最大值,插入/删除一个限制。
这可以使用线段树/平衡树维护。
线段树上下标为(l)的位置初始为(l),每一次对一个后缀减去某个值,或者查询从前往后第一个权值(>0)的前缀。
第一个操作可以打标记,第二个操作可以线段树上二分。

原文地址:https://www.cnblogs.com/ctmlpfs/p/14542683.html