【BZOJ2002】弹飞绵羊
2015-11-18 19:35
267 查看
第一道LCT,纪念一下~
[code]#include<iostream> #include<cstdio> #define maxn 200000 using namespace std; int n; int ch[maxn+10][2],fa[maxn+10],sz[maxn+10]; int rc(int f,int o){return ch[f][1]==o;} void pushup(int o){ if(!o)return; sz[o]=sz[ch[o][0]]+sz[ch[o][1]]+1; } bool root(int o){return ch[fa[o]][0]!=o&&ch[fa[o]][1]!=o;} void rotate(int o){ int f=fa[o],r=rc(fa[o],o); if(!root(f))fa[ch[fa[f]][rc(fa[f],f)]=o]=fa[f]; else fa[o]=fa[f]; fa[ch[f][r]=ch[o][r^1]]=f; fa[ch[o][r^1]=f]=o; pushup(f); pushup(o); } void splay(int o){ while(!root(o)){ if(!root(fa[o])&&rc(fa[fa[o]],fa[o])==rc(fa[o],o))rotate(fa[o]); rotate(o); } } void access(int u){ int v=0; while(u){ splay(u); ch[u][1]=v; pushup(u); v=u; u=fa[u]; } } void join(int v,int u){ access(v); splay(v); fa[ch[v][0]]=0; ch[v][0]=0; fa[v]=u; access(v); } int main(){ freopen("2002.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++){ int a; scanf("%d",&a); fa[i]=min(n+1,i+a); } int m; scanf("%d",&m); while(m--){ int k,u; scanf("%d%d",&k,&u); u++; if(k==1){ access(u); splay(u); printf("%d\n",sz[u]-1); }else{ int c; scanf("%d",&c); join(u,min(n+1,u+c)); } } return 0; }
相关文章推荐
- 关于地震的数据的自动判断,豆豆成长日记
- ***CodeIgnite/CI 去掉 index.php的 配置
- jira
- 高效的输入函数 --- 适用于ACM竞赛里输入数据特别多的情况
- DB2中的SMS和DMS
- 【JSON】parse()和stringfy()方法
- 使用httperrequest,模拟发送及接收Json请求
- codeforces #331 D. Wilbur and Trees (dp)
- 欢迎使用CSDN-markdown编辑器
- 解决python文件转换为exe时乱码问题
- 可以复制的label
- DCMTK:带有多张图片的dcm文件转成多张QImage与多张图片添加到一个dcm文件
- menu中xml中设置item
- Apache-Tika解析HTML文档
- 选择成为质数
- ExtJS4.2学习(三)Grid表格(转)
- 【经典】关于C语言内存移动函数的写法详解
- PAT 1003. Emergency (25)
- 抽象工厂+反射+依赖注入 实现对数据访问层和业务逻辑层的优化
- 第十周项目6 二叉树b中值为x的层数