显然用LCT维护一下经过一条链之后每一位原来是1会变成什么原来是0会变成什么即可
这样的话LCT复杂度是n log n * k的,链剖是n log^2 n * k的,都过不了
考虑把这个k给去掉,我们直接开两个unsigned long long,v0和v1,v0的每一位代表这一位原来是0的话经过这条链会变成什么,v1的每一位代表这一位原来是1的话经过这条链会变成什么
那么考虑信息的合并,假如你现在知道了v0[x],v1[x],v0[y],v1[y],先经过x后经过y,那么合并之后新的v0=(v0[x]&v1[y])|(~v0[x]&v0[y]),v1=(v1[x]&v1[y])|(~v1[x]&v0[y])
比较好理解吧……就是比如v0,原来的0变成1那些位就会变成v1[y]中对应的位,变成0的那些位会变成v0[y]中对应的位,那么与一下,然后合起来就好了
链剖和LCT我都写了,结果LCT TLE了,链剖3s过了
#include<iostream>
#include<cs