bzoj 5361: [Lydsy1805月赛]对称数 可持久化线段树 思路|无代码

发布时间 2023-03-27 11:38:40作者: liyishui

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