马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊

LCT: bzoj2049 1A 7min

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + 10;
const int mod = 1e9+7;

struct LCT {
    int ch[M][2], fa[M], sz[M]; bool rev[M];
    # define ls ch[x][0]
    # define rs ch[x][1]
    inline void up(int x) {
        if(!x) return ;
        sz[x] = 1 + sz[ls] + sz[rs];
    }
    inline void pushrev(int x) {
        if(!x) return ;
        rev[x] ^= 1;
        swap(ch[x][0], ch[x][1]);
    }
    inline void down(int x) {
        if(!x) return ;
        if(rev[x]) {
            pushrev(ls);
            pushrev(rs);
            rev[x] = 0;
        }
    }
    # undef ls 
    # undef rs
    inline bool isrt(int x) {
        return ch[fa[x]][0] != x && ch[fa[x]][1] != x;
    }
    inline void rotate(int x) {
        int y = fa[x], z = fa[y], ls = ch[y][1] == x, rs = ls^1;
        if(!isrt(y)) ch[z][ch[z][1] == y] = x;
        fa[ch[x][rs]] = y; fa[y] = x, fa[x] = z;
        ch[y][ls] = ch[x][rs]; ch[x][rs] = y;
        up(y); up(x);
    }
    int st[M];
    inline void splay(int x) {
        int stn = 0, tx = x;
        while(!isrt(tx)) st[++stn] = tx, tx = fa[tx];
        st[++stn] = tx;
        for (int i=stn; i; --i) down(st[i]);
        while(!isrt(x)) {
            int y = fa[x], z = fa[y];
            if(!isrt(y)) {
                if((ch[z][0] == y) ^ (ch[y][0] == x)) rotate(x);
                else rotate(y);
            }
            rotate(x);
        }
    }
    inline int access(int x) {
        int t = 0;
        for (; x; t=x, x=fa[x]) {
            splay(x);
            ch[x][1] = t;
            up(x);
        }
        return t;
    }
    inline void makeroot(int x) {
        access(x); splay(x); pushrev(x);
    }
    inline int find(int x) {
        access(x); splay(x);
        while(ch[x][0]) x = ch[x][0];
        return x;
    }
    inline void link(int x, int y) {
        makeroot(x); fa[x] = y;
    }
    inline void cut(int x, int y) {
        makeroot(x); access(y); splay(y); ch[y][0] = fa[x] = 0; up(y);
    }
}T;

int n, Q, x, y;

int main() {
    static char op[23];
    cin >> n >> Q;
    for (int i=1; i<=n; ++i) {
        T.ch[i][0] = T.ch[i][1] = T.fa[i] = 0;
        T.sz[i] = 1; T.rev[i] = 0;
    }
    while(Q--) {
        scanf("%s%d%d", op, &x, &y);
        if(op[0] == 'C') T.link(x, y);
        else if(op[0] == 'D') T.cut(x, y);
        else puts(T.find(x) == T.find(y) ? "Yes" : "No");
    }
    return 0;
}
View Code

相关文章: