第一次写lct

(这是一道lct裸题

这次没有可爱(划掉)的同学教我,虽然有模板,但是配合网上的讲解还是看不懂QAQ

然后做了几道题之后总算有些感觉辣

于是决定给自己挖个坑,近期写一个lct详解(不过像我这么懒的人= =

下面是代码

 /**************************************************************
Problem: 2049
User: cminus
Language: C++
Result: Accepted
Time:1532 ms
Memory:984 kb
****************************************************************/ #include <cstdio>
#include <algorithm>
#include <stack>
using namespace std;
#define kd(x) (ch[fa[x]][1] == x)
#define setc(f, c, k) (ch[fa[c] = f][k] = c)
#define isRoot(x) (ch[fa[x]][0] != x and ch[fa[x]][1] != x)
#define ls ch[x][0]
#define rs ch[x][1]
const int N = ; int fa[N], ch[N][], n, m;
bool mark[N]; inline void push(int x){
if (mark[x]){
mark[x] = false;
mark[ls] ^= ;
mark[rs] ^= ;
swap(ls, rs);
}
}
stack < int > S;
inline void pushDown(int x) {
S.push(x);
while (!isRoot(x))
S.push(x = fa[x]);
while (!S.empty())
push(S.top()), S.pop();
} inline void rotate (int x) {
int y = fa[x], k = kd(x);
setc(y, ch[x][k ^ ], k);
if (isRoot(y)) fa[x] = fa[y];
else setc(fa[y], x, kd(y));
setc(x, y, k ^ );
} inline void splay (int x) {
pushDown(x);
while (! isRoot(x)) {
if (! isRoot(fa[x]))
if (kd(x) == kd(fa[x])) rotate(fa[x]);
else rotate(x);rotate(x);
}
} inline void access(int x) {
int t = ;
while (x) {
splay(x);
rs = t; t = x; x = fa[x];
}
} inline void makeRoot(int u) {
access(u); splay(u);
mark[u] ^= ;
} inline void link(int u, int v){
makeRoot(u); fa[u] = v;
} inline void cut(int u, int v){
makeRoot(u);
access(v); splay(v);
fa[u] = ch[v][] = ;
} inline int findRoot(int x) {
while(fa[x]) x = fa[x];
return x;
}
int main(){
scanf("%d %d", &n, &m);
char str[];
while(m--){
int u, v;
scanf("%s %d %d", str, &u, &v);
if (*str == 'C') link(u, v);
else if (*str == 'D') cut(u, v);
else puts((findRoot(u) == findRoot(v)) ? "Yes" : "No");
}
return ;
}

最新文章

  1. Java 8 的 Nashorn 脚本引擎教程
  2. 时光煮雨 Unity3D实现2D人物动画① UGUI&amp;Native2D序列帧动画
  3. lamper技能树
  4. SELECT INTO和INSERT INTO SELECT
  5. Open Explorer Plugin for Eclipse (eclipse 插件 在eclipse里面打开文件目录)
  6. HDU-4664 Triangulation 博弈,SG函数找规律
  7. js方法实现--上传文件功能
  8. 修改tomcat JVM 大小
  9. hive中,动态添加map和reduce的大小,以增加并行度
  10. Access,MSSQL:随机读取N条记录
  11. Dockerfile详解(二)
  12. Security Permissions Caching
  13. MySQL基础 - 视图
  14. 在Eclipse之中调试FastDFS-storage
  15. [AngularJS] Angular 1.3 ngAria - 2
  16. 腾讯 微信春招nlp实习生一面二面(猝)
  17. 高德地图API获取天气
  18. Storm实战常见的问题
  19. [转] 利用js实现 禁用浏览器后退
  20. POJ 1860 Currency Exchange【bellman_ford判断是否有正环——基础入门】

热门文章

  1. Android 基础知识 -- Linux环境搭建
  2. afl-fuzz技术初探
  3. Log4net实用说明
  4. css总结 -使用display:inline-block,出现元素高度错位
  5. 关于整合ssh中的细节03
  6. java实现判断两个二叉树是否相同
  7. 《深入理解java虚拟机》读书笔记五——第六章
  8. AtCoder Beginner Contest 068 ABCD题
  9. H3C IP路由基础
  10. cdn第三方前端依赖架包共享地址