zoukankan      html  css  js  c++  java
  • lupgu P3950 部落冲突

    题目链接

    luogu P3950 部落冲突

    题解

    树剖线段树可以
    lct还行

    代码

    #include<cstdio> 
    #include<algorithm> 
    
    inline int read() { 
        int x = 0,f = 1; 
        char c = getchar(); 
        while(c < '0' || c > '9')c = getchar(); 
        while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar(); 
        return x * f; 
    } 
    const int maxn = 300007; 
    int ch[maxn][2],rev[maxn],fa[maxn]; 
    bool isroot(int x) { return ch[fa[x]][1] != x && ch[fa[x]][0] != x;} 
    void pushdown(int x) {
        if(rev[x]) {rev[x] ^= 1,std::swap(ch[x][1],ch[x][0]),rev[ch[x][1]] ^= 1,rev[ch[x][0]] ^= 1;}
    } 
    void rotate(int x) { 
        int y = fa[x],z = fa[y],d = (ch[y][1] == x) ^ 1; 
        if(!isroot(y)) ch[z][ch[z][1] == y] = x; 
        fa[x] = z; 
        ch[y][d ^ 1] = ch[x][d]; fa[ch[x][d]] = y; 
        ch[x][d] = y; fa[y] = x; 
    } 
    int stack[maxn],top = 0; 
    void splay(int x) { 
        stack[++ top] = x; 
        for(int i = x;!isroot(i);i = fa[i]) stack[++ top] = fa[i]; 
        while(top) pushdown( stack[top --]); 
        while(!isroot(x)) {
            int y = fa[x],z = fa[y]; 
            if(!isroot(y)) { 
                if((ch[y][1] == x) ^ (ch[z][1] == y)) rotate(x); 
                else rotate(y); 
            } rotate(x); 
        } 
    } 
    void access(int x) {
        for(int i = 0;x;i = x , x = fa[x]) 
            splay(x), ch[x][1] = i; 
    } 
    void makeroot(int x) {access(x),splay(x),rev[x] ^= 1; }
    void link(int x,int y) { makeroot(x),fa[x] = y;return splay(x); } 
    void cut(int x,int y) {makeroot(x),access(y),splay(y),ch[y][0] = fa[x] = 0;}
    int find(int x) { 
        for(access(x),splay(x);ch[x][0];x = ch[x][0]) ; 
            return x; 
    } 
    int p1[maxn],p2[maxn],num = 0; 
    int main() { 
        int n,m; 
        n = read(),m = read(); 
        for(int a,b,i = 1;i < n;++ i) a = read(),b = read(),link(a,b); 
        char s[10]; 
        while(m -- ) { 
            int a,b; 
            scanf("%s",s + 1); 
            if(s[1] == 'U') {a = read(), link(p1[a],p2[a]);} 
            else if(s[1] == 'C') {a = read(),b = read();++ num,cut(p1[num] = a,p2[num] = b);} 
            else {a = read(),b = read();puts(find(a) == find(b) ? "Yes" : "No"); } 
        } 
        return 0; 
    } 
    
  • 相关阅读:
    hadoop2.2.0伪分布式搭建
    HBase详解
    Hbase常用命令
    hbase读取数据原理
    约瑟夫环
    哈希表设计
    哈夫曼树的建立
    TCP的连接和释放
    什么是Kmp算法?
    什么是https
  • 原文地址:https://www.cnblogs.com/sssy/p/9465151.html
Copyright © 2011-2022 走看看