博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2843: 极地旅行社
阅读量:5347 次
发布时间:2019-06-15

本文共 2764 字,大约阅读时间需要 9 分钟。

伪老年选手临时抱佛脚之LCT

正确率还挺高?只有两个小bug

然而不是说好caioj复习模板吗

啊?能升rank还能复习当然更好啦

#include
#include
#include
#include
#include
#include
using namespace std;struct LCT{ int f,son[2];bool fz; int d,c; LCT(){f=0;son[0]=son[1]=0;fz=false;}}tr[31000];void update(int x){ int lc=tr[x].son[0],rc=tr[x].son[1]; tr[x].c=tr[lc].c+tr[rc].c+tr[x].d;}void reverse(int x){ tr[x].fz=false; swap(tr[x].son[0],tr[x].son[1]); int lc=tr[x].son[0],rc=tr[x].son[1]; if(lc!=0)tr[lc].fz=1-tr[lc].fz; if(rc!=0)tr[rc].fz=1-tr[rc].fz;}void rotate(int x,int w){ int f=tr[x].f,ff=tr[f].f; int R,r; R=f;r=tr[x].son[w]; tr[R].son[1-w]=r; if(r!=0)tr[r].f=R; R=ff;r=x; if(tr[R].son[0]==f)tr[R].son[0]=r; else if(tr[R].son[1]==f)tr[R].son[1]=r; tr[r].f=R; R=x;r=f; tr[R].son[w]=r; tr[r].f=R; update(f); update(x);}bool isroot(int x,int rt){ int f=tr[x].f; if(f==rt||(tr[f].son[0]!=x&&tr[f].son[1]!=x))return true; else return false;}int ts,tmp[31000];void splay(int x,int rt){ ts=0;int i=x; while(isroot(i,rt)==false) { tmp[++ts]=i; i=tr[i].f; } tmp[++ts]=i; while(ts>0) { i=tmp[ts--]; if(tr[i].fz==true)reverse(i); } //~~~~reverse while(isroot(x,rt)==false) { int f=tr[x].f,ff=tr[f].f; if(isroot(f,rt)==true) { if(tr[f].son[0]==x)rotate(x,1); else rotate(x,0); } else { if(tr[ff].son[0]==f&&tr[f].son[0]==x){rotate(f,1);rotate(x,1);} else if(tr[ff].son[1]==f&&tr[f].son[1]==x){rotate(f,0);rotate(x,0);} else if(tr[ff].son[0]==f&&tr[f].son[1]==x){rotate(x,0);rotate(x,1);} else if(tr[ff].son[1]==f&&tr[f].son[0]==x){rotate(x,1);rotate(x,0);} } }}//~~~splayvoid access(int x){ int y=0; while(x!=0) { splay(x,0); tr[x].son[1]=y; if(y!=0)tr[y].f=x; update(x); y=x;x=tr[x].f; }}int makeroot(int x){ access(x);splay(x,0); tr[x].fz=1-tr[x].fz;}//-------------in---------------------void Link(int x,int y){ makeroot(x);tr[x].f=y;access(x);}int findroot(int x){ access(x);splay(x,0); while(tr[x].son[0]!=0)x=tr[x].son[0]; return x;}void change(int x,int d){ makeroot(x);access(x); tr[x].d=d;tr[x].c=d;}int getsum(int x,int y){ makeroot(x); access(y);splay(y,0); return tr[y].c;}//------------out---------------------char ss[20];int main(){ freopen("data.in","r",stdin); freopen("1.out","w",stdout); int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&tr[i].d), tr[i].c=tr[i].d; int Q,x,y,k; scanf("%d",&Q); while(Q--) { scanf("%s",ss+1); if(ss[1]=='b') { scanf("%d%d",&x,&y); if(findroot(x)==findroot(y))printf("no\n"); else { printf("yes\n"); Link(x,y); } } else if(ss[1]=='p') { scanf("%d%d",&x,&k); change(x,k); } else { scanf("%d%d",&x,&y); if(findroot(x)!=findroot(y))printf("impossible\n"); else printf("%d\n",getsum(x,y)); } } return 0;}

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/8954931.html

你可能感兴趣的文章
Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf 【动态规划】0-1背包
查看>>
SparkStreaming 源码分析
查看>>
【算法】—— 随机音乐的播放算法
查看>>
mysql asyn 示例
查看>>
DataGrid 点击 获取 行 ID
查看>>
git 使用
查看>>
边框圆角方法
查看>>
asp.net WebApi自定义权限验证消息返回
查看>>
php中eval函数的危害与正确禁用方法
查看>>
20172315 2017-2018-2 《程序设计与数据结构》第十一周学习总结
查看>>
MySQL添加、修改、撤销用户数据库操作权限的一些记录
查看>>
关于谷歌浏览器Chrome正在处理请求的问题解决
查看>>
Git核心技术:在Ubuntu下部署Gitolite服务端
查看>>
平面波展开法总结
查看>>
建造者模式
查看>>
ArraySort--冒泡排序、选择排序、插入排序工具类demo
查看>>
composer 安装laravel
查看>>
8-EasyNetQ之Send & Receive
查看>>
Android反编译教程
查看>>
List<string> 去重复 并且出现次数最多的排前面
查看>>