C. 【UNR #3】配对树

题解:


首先可以贪心 于是问题可以等价成一条边被算当且仅当子树中个数为奇数个

题解的做法比较简单

考虑每条边,加入其子树内的点

然后为了保证区间长度为偶数

分成f0,0 f0,1 f1,0 f1,1即可

暴力插入复杂度不对改成启发式合并即可

这里插入的时候可用线段树维护 把x-n这一段翻转即可

这样是两个log

一般可以用线段树合并优化启发式合并

但是这里改成线段树合并的话要换一种维护方式

我们维护左儿子ddl的个数来决定右儿子中的信息是直接加还是需要翻转

这样就可以线段树合并了

复杂度一个log

另外我开始想了一个2个log的做法

为了保证区间长度为偶数 我们分成从奇数还是偶数开始两种情况,之后把两个看成一组

于是我们现在要维护的就是,到当前考虑的序列的点

树上的每个点,其子树内有偶数个点的方案数、奇数个点的方案数

然后观察插入两个点的时候

当且仅当这个点在两个点的路径上(除lca) 增加了奇数个点,其余都是增加偶数个点

取出两点路径可以利用树链剖分

然后要支持两种操作 1.偶数=原本奇数,奇数=原本偶数+1 2.偶数=原本偶数+1,奇数=原本奇数

这个我们采用线段树维护

维护三个标记 rev、偶数+、奇数+即可

原文地址:https://www.cnblogs.com/yinwuxiao/p/11130550.html