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

浙公网安备 33010602011771号