LCT 全T 求调
查看原帖
LCT 全T 求调
680400
xlpg0713楼主2023/11/22 16:00

测试是 split 操作寄了,但是不知道到底是什么

代码(应该算好看吧):

#include<iostream> 
#include<algorithm>
const int N = 3e5 + 10;
int n, m, son[N][2], v[N], sm[N], tg[N], fa[N];
inline int& ls(int p){return son[p][0];}
inline int& rs(int p){return son[p][1];}
inline void rev(int p){std::swap(ls(p), rs(p));  tg[p] ^= 1;}
inline void phd(int p){tg[p] ? rev(ls(p)), rev(rs(p)), tg[p] = 0 : 0;}
inline void phu(int p){sm[p] = v[p] ^ sm[ls(p)] ^ sm[rs(p)];}
inline bool isrt(int p){return ls(fa[p]) != p && rs(fa[p]) != p;}
inline bool gs(int p){return rs(fa[p]) == p;}
inline void upd(int p){if(!isrt(p)) upd(fa[p]); phd(p);}
inline void rot(int p){
    int f = fa[p], g = fa[f], o = gs(p);
    if(!isrt(f)) son[g][gs(f)] = p, fa[p] = g;
    son[f][o] = son[p][o ^ 1]; 
    if(son[p][o ^ 1]) fa[son[p][o ^ 1]] = f;
    son[p][o ^ 1] = f, fa[f] = p;
}
inline void splay(int p){
    upd(p); while(!isrt(p)){
        if(gs(p) == gs(fa[p]) && !isrt(fa[p]))
            rot(fa[p]); rot(p);
    }
}
inline void access(int p){
    for(int x = 0; p; x = p, p = fa[p])
        splay(p), rs(p) = x, phu(p);
}
inline void mkrt(int p){access(p), splay(p), rev(p);}
inline int fdrt(int p){access(p), splay(p);
    while(ls(p)) phd(p), p = ls(p); splay(p); return p;}
inline void split(int x, int y){mkrt(x); access(y); splay(y);}
inline void lnk(int x, int y){mkrt(x); if(fdrt(y) != x) fa[x] = y;}
inline void ct(int x, int y){mkrt(x); 
    if(fdrt(y) == x && fa[y] == x && !ls(y)) fa[y] = rs(x) = 0, phu(x);}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);std::cout.tie(0);
    std::cin >> n >> m;
    for(int i = 1; i <= n; i++) std::cin >> v[i];
    for(int i = 1, o, x, y; i <= m; i++){
        std::cin >> o >> x >> y;
        if(o == 0) split(x, y), std::cout << sm[y] << '\n';
        if(o == 1) lnk(x, y); if(o == 2) ct(x, y);
        if(o == 3) splay(x), v[x] = y, phu(x);
    }
}
2023/11/22 16:00
加载中...