C. 【UNR #3】配对树
题解:
首先可以贪心 于是问题可以等价成一条边被算当且仅当子树中个数为奇数个
题解的做法比较简单
考虑每条边,加入其子树内的点
然后为了保证区间长度为偶数
分成f0,0 f0,1 f1,0 f1,1即可
暴力插入复杂度不对改成启发式合并即可
这里插入的时候可用线段树维护 把x-n这一段翻转即可
这样是两个log
一般可以用线段树合并优化启发式合并
但是这里改成线段树合并的话要换一种维护方式
我们维护左儿子ddl的个数来决定右儿子中的信息是直接加还是需要翻转
这样就可以线段树合并了
复杂度一个log
另外我开始想了一个2个log的做法
为了保证区间长度为偶数 我们分成从奇数还是偶数开始两种情况,之后把两个看成一组
于是我们现在要维护的就是,到当前考虑的序列的点
树上的每个点,其子树内有偶数个点的方案数、奇数个点的方案数
然后观察插入两个点的时候
当且仅当这个点在两个点的路径上(除lca) 增加了奇数个点,其余都是增加偶数个点
取出两点路径可以利用树链剖分
然后要支持两种操作 1.偶数=原本奇数,奇数=原本偶数+1 2.偶数=原本偶数+1,奇数=原本奇数
这个我们采用线段树维护
维护三个标记 rev、偶数+、奇数+即可