题面

传送门:https://www.luogu.org/problemnew/show/P2147

Solution

这题......

我们可以发现题目要求我们维护一个动态森林,而且只查询连通性....

显然LCT模板题啊,关于LCT玩法,可以猛戳这里学习

Code

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=10000+100;
struct LCT
{
int fa[N],son[N][2],lazy[N],mstack[N],top;
inline bool isRoot(int x)
{
return x!=son[fa[x]][0]&&x!=son[fa[x]][1];
}
inline void pushdown(int x)
{
if(lazy[x]==0) return;
lazy[son[x][0]]=!lazy[son[x][0]],swap(son[son[x][0]][0],son[son[x][0]][1]);
lazy[son[x][1]]=!lazy[son[x][1]],swap(son[son[x][1]][0],son[son[x][1]][1]);
lazy[x]=0;
}
inline void rotate(int x,int type)
{
int y=fa[x],z=fa[y];
if(isRoot(y)==false) son[z][y==son[z][1]]=x;
fa[x]=z;
fa[son[x][type]]=y,son[y][!type]=son[x][type];
son[x][type]=y,fa[y]=x;
}
void splay(int x)
{
mstack[top=1]=x;
for(int i=x;isRoot(i)==false;i=fa[i])
mstack[++top]=fa[i];
for(int i=top;i>=1;i--)
pushdown(mstack[i]);
while(isRoot(x)==false)
{
if(x==son[fa[x]][fa[x]==son[fa[fa[x]]][1]] and isRoot(fa[x])==false)
rotate(fa[x],x==son[fa[x]][0]),
rotate(x,x==son[fa[x]][0]);
else
rotate(x,x==son[fa[x]][0]);
}
}
void Access(int x)
{
for(int t=0;x!=0;t=x,x=fa[x])
splay(x),son[x][1]=t;
}
void MakeRoot(int x)
{
Access(x);
splay(x);
lazy[x]=!lazy[x],swap(son[x][0],son[x][1]);
}
int FindRoot(int x)
{
Access(x),splay(x);
while(son[x][0]!=0)
pushdown(x),x=son[x][0];
return x;
}
void Link(int x,int y)
{
MakeRoot(x);
fa[x]=y;
}
void split(int x,int y)
{
MakeRoot(x);
Access(y),splay(y);
}
void Cut(int x,int y)
{
split(x,y);
son[y][0]=fa[x]=0;
}
}lct;
int n,m;
int main()
{
n=read(),m=read(); char OP[15];
for(int i=1;i<=m;i++)
{
scanf("%s",OP+1);
int u=read(),v=read();
if(OP[1]=='C')
lct.Link(u,v);
else if(OP[1]=='D')
lct.Cut(u,v);
else
{
if(lct.FindRoot(u)==lct.FindRoot(v))
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}

最新文章

  1. Windows服务定时执行任务
  2. CUBRID学习笔记 33 net事务 cubrid教程示例
  3. lost+found目录
  4. DBA_Oracle日志文件 - altert / trace /audit / redo / archive log(概念)
  5. LoadRunner - 当DiscuzNT遇上了Loadrunner(中) (转发)
  6. PATH环境变量和CLASSPATH环境变量详解
  7. C 高级编程3 静态库与动态库
  8. 关于MySQL的各种总结
  9. 【转】adobe acrobat pro修改pdf文字
  10. windows下配置lamp环境(5)---配置MySQL5.6
  11. block 解析 - 成员变量
  12. Java面经
  13. VMSTAT监控CPU使用率,内存使用,虚拟内存交换情况
  14. Fluent动网格【12】:扩散光顺
  15. 有哪些你不知道的python小工具
  16. RPC原理
  17. Linux服务器下Nginx与Apache共存
  18. uboot i2c 操作函数记录
  19. 1.如何在Cloud Studio上执行Python代码?
  20. Selenium3自动化问题二:各chrome版本对应的chromedriver版本

热门文章

  1. Python练习题 021:递归方法求阶乘
  2. P4552 [Poetize6] IncDec Sequence
  3. Java中的对象都是在堆上分配的吗?
  4. 多测师讲解python __for 循环___高级讲师肖sir
  5. 从面试角度学完 Kafka
  6. 扫描仪扫描文件处理-ABBYY生成小体积黑白二值化PDF
  7. spring boot:用zxing生成二维码,支持logo(spring boot 2.3.2)
  8. zookeeper的客户端常用操作
  9. linux 压缩 tar命令
  10. flask生产环境部署