[BZOJ2049][Sdoi2008]Cave 洞穴勘测
2015-08-31 00:00
423 查看
原题地址
LCT…
AC code:
LCT…
AC code:
#include <cstdio> const int N=100010; int n,m; struct nod{ int num; bool rev; nod *pp,*pr,*ch[2]; }*NIL,pool ; struct LCT{ nod *pt ; LCT(){ NIL=&pool[0]; for(int i=1;i<=n;i++){ pt[i]=&pool[i]; pt[i]->num=i;pt[i]->pp=pt[i]->pr=pt[i]->ch[0]=pt[i]->ch[1]=NIL; } } void clear(nod *p){ if((!p->rev)||p==NIL) return ; nod *t=p->ch[0];p->ch[0]=p->ch[1];p->ch[1]=t; p->rev=0;p->ch[0]->rev^=1;p->ch[1]->rev^=1; } void rotate(nod *x,bool t){ nod *y=x->pr,*z=y->pr,*b=x->ch[t^1]; b->pr=y;y->pr=x;x->pr=z;y->ch[t]=b;x->ch[t^1]=y; if(z->ch[0]==y) z->ch[0]=x; if(z->ch[1]==y) z->ch[1]=x; } void splay(nod *x){ int tot=0; nod *r=x; nod *tmp ; for(nod *i=x;i!=NIL;i=i->pr) tmp[++tot]=i; for(int i=tot;i>0;i--) clear(tmp[i]); while(x->pr!=NIL){ nod *y=x->pr,*z=y->pr; r=(z==NIL?y:z); if(z==NIL&&y->ch[0]==x) rotate(x,0); else if(z==NIL&&y->ch[1]==x) rotate(x,1); else if(z->ch[0]==y&&y->ch[0]==x) {rotate(y,0);rotate(x,0);} else if(z->ch[1]==y&&y->ch[1]==x) {rotate(y,1);rotate(x,1);} else if(z->ch[1]==y&&y->ch[0]==x) {rotate(x,0);rotate(x,1);} else {rotate(x,1);rotate(x,0);} } x->pp=r->pp; } void access(nod *x){ for(nod *u=x,*v=NIL;u!=NIL;v=u,u=u->pp) {splay(u);u->ch[1]->pr=NIL;u->ch[1]->pp=u;u->ch[1]=v;v->pr=u;} } void makeroot(nod *x){ access(x);splay(x);x->rev^=1; } void link(int u,int v){ nod *x=pt[u],*y=pt[v]; makeroot(x);x->pp=y; } void cut(int u){ nod *x=pt[u]; access(x);splay(x);x->ch[0]->pp=x->ch[0]->pr=NIL;x->ch[0]=NIL; } int getroot(int u){ nod *x=pt[u]; access(x);splay(x); for(;x->ch[0]!=NIL;x=x->ch[0],clear(x)) ; return x->num; } int lca(int u,int v){ nod *x=pt[u],*y=pt[v]; access(x);access(y);splay(x); if(x->pp!=NIL) return x->pp->num; return x->num; } }; int main(){ scanf("%d%d",&n,&m); LCT T; for(int i=1;i<=m;i++){ int u,v; char s[11]; scanf("%s%d%d",s,&u,&v); if(s[0]=='C') T.link(u,v); else if(s[0]=='Q') printf("%s\n",T.getroot(u)==T.getroot(v)?"Yes":"No"); else T.cut(T.lca(u,v)==u?v:u); } return 0; }
相关文章推荐
- HDU 5062 Beautiful Palindrome Number——BestCoder Round #13
- CentOS 使用yum升级subversion1.8
- PHP x86,x64,VC6,VC9,VC11,TS和NTS的选择
- TurboMail邮件系统与利郎服装集团合作
- UTF-8的项目向GBK项目传递的参数中携带了中文造成中文乱码的解决方案。
- 安卓的优缺点
- 安卓常用开发命令
- 检查上传图片的大小和格式
- 【C#】读取和写入本地txt文件
- UVA 10340 All in All
- getChildStaticTransformation与硬件加速冲突解决办法
- 在Oracle client 端进行SQL*Net trace的步骤以及注意点
- MindFusion.Charting for WPFv1.9发布,高性能图表控件【附下载】
- VIEWGOOD(远古)网络电视台的应用
- 保利威视后台录屏类视频清晰度优化说明
- web.xml中的welcome-file认识
- TQ335x——spidev驱动的生成
- 通达OA2015年全国巡回培训会引爆羊城
- 为Action的属性注入值
- 指定struts2处理的请求后缀