bzoj 5361: [Lydsy1805月赛]对称数 可持久化线段树 思路|无代码
2333居然有一天做题会做到找来找去找不到oj有这道题
虽然说HydroOJ保存了不少bzoj的题,但总归仍不是非常完善,bzoj你为什么不争气点——
题意:
给定一棵树,n个点,每个点有点权
给出m条询问,每次问(u,v)的路径上出现了偶数次的最小数
题解:
出现了偶数次,联想到异或和为0,但是直接用点权异或的话可能会引起冲突
于是我们对于值域[1,200000]内的每个数,随机一个ull范围内的随机数给该数,并求一个异或前缀和s
考虑把(u,v)通过树上差分拆成拍平的区间
如果区间[L,R]内每个点的权值异或和==s[R]^s[L-1],则说明每个数都出现了奇数次,反之则必定有数出现偶数次
主席树维护的是权值线段树,下标为点权,下标的值所管辖的区间的异或和(异或的当然是随机出来的数啦)
每次新增节点时就是找到点权对应的位置,沿路异或上s[点权]
这样就能求(u,v)区间内点的权值异或和了
答案具有单调性,在主席树上对点权二分即可,check是O(1)的。
时间复杂度是NlogN(求lca)+主席树的时间复杂度MlogM,其中N=点数,M=点权范围
-----------------
其实这个题如果n和m开小一点的话,树上莫队应该也能写,但是最小值撤销的时候不好撤销,可能还要上回滚莫队
(什么树上回滚莫队,逃
code:
None:D