zoukankan      html  css  js  c++  java
  • 【洛谷 P2147】 [SDOI2008]洞穴勘测(LCT)

    题目链接
    LCT裸题。。

    #include <cstdio>
    #define R register int
    #define I inline void
    #define lc c[x][0]
    #define rc c[x][1]
    const int MAXN = 300010;
    inline int read(){
        int s = 0, w = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); }
        while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
        return s * w;
    }
    int f[MAXN], c[MAXN][2], v[MAXN], s[MAXN], st[MAXN], tag[MAXN];
    inline int nroot(R x){
    	return c[f[x]][0] == x || c[f[x]][1] == x;
    }
    I swap(R x){
    	lc ^= rc; rc = lc ^ rc; lc ^= rc; tag[x] ^= 1;
    }
    I pushdown(R x){
    	if(tag[x]){
    		swap(lc); swap(rc);
    		tag[x] = 0;
    	}
    }
    I rotate(R x){
    	R y = f[x], z = f[y], k = c[y][1] == x, w = c[x][!k];
    	if(nroot(y)) c[z][c[z][1] == y] = x;
    	c[x][!k] = y; c[y][k] = w; f[y] = x; f[x] = z;
    	if(w) f[w] = y;
    }
    I splay(R x){
    	R y = x, z = 0;
    	st[++z] = y;
    	while(nroot(y)) st[++z] = y = f[y];
    	while(z) pushdown(st[z--]);
    	while(nroot(x)){
    		y = f[x]; z = f[y];
    		if(nroot(y)) (c[z][1] == y) ^ (c[y][1] == x) ? rotate(x) : rotate(y);
    		rotate(x);
    	}
    }
    I access(R x){
    	for(R y = 0; x; x = f[y = x]){
    	   splay(x); rc = y; 
        }
    }
    I makeroot(R x){
    	access(x); splay(x); 
    	swap(x);
    }
    inline int findroot(R x){
    	access(x); splay(x);
    	pushdown(x);
    	while(lc){ x = lc; pushdown(x); }
    	splay(x);
    	return x;
    }
    I split(R x, R y){
    	makeroot(x); access(y); splay(y);
    }
    I link(R x, R y){
    	makeroot(x);
    	f[x] = y;
    }
    I cut(R x, R y){
    	split(x, y);
    	f[x] = c[y][0] = 0;
    }
    int n, m, a, b;
    char opt;
    int main(){
    	n = read(); m = read();
    	while(m--){
    		opt = getchar(); while(opt < 'A' || opt > 'Z') opt = getchar();
    		a = read(); b = read();
    		switch(opt){
    			case 'C' : link(a, b); break;
    			case 'D' : cut(a, b); break;
    			case 'Q' : printf("%s
    ", findroot(a) == findroot(b) ? "Yes" : "No");
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Oracle PL/SQL
    plsql命令行窗口执行脚本打印输出
    Oracle 数据库维护管理之--数据库基本信息表管理与优化参考1
    Oracle 数据库维护管理之--dbms_lock
    Oracle sys或者system的默认密码
    Docker学习--docker的基本认识
    正则表达式--指定时间格式校验
    Docker学习--基本docker命令
    HTTP协议以及HTTP请求中8种请求方法
    如何查看class文件的jdk版本
  • 原文地址:https://www.cnblogs.com/Qihoo360/p/10331446.html
Copyright © 2011-2022 走看看