bzoj2002 弹飞绵羊
来源:互联网 发布:淘宝网晚礼服图片 编辑:程序博客网 时间:2024/04/28 04:23
LCT 裸题,技巧是反着建边才能维护向下路径
/************************************************************** Problem: 2002 User: Clare Language: C++ Result: Accepted Time:1884 ms Memory:6036 kb****************************************************************/ #include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#include <vector>#include <stack>using namespace std; #define N 200010 int n,m;int size[N],fa[N],c[N][2],Next[N];bool Rev[N];stack<int> st; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();} return x*f;} void Pushup(int k){ int l=c[k][0],r=c[k][1]; size[k]=size[l]+size[r]+1;} void Pushdown(int k){ int l=c[k][0],r=c[k][1]; if(Rev[k]) { Rev[k]^=1;Rev[r]^=1;Rev[l]^=1; swap(c[k][0],c[k][1]); }} bool Pd_root(int k){ return !(c[fa[k]][0]==k)&&!(c[fa[k]][1]==k);} void Rotate(int x){ int y=fa[x],z=fa[y],l,r; if(c[y][0]==x)l=0;else l=1; r=l^1; if(Pd_root(y)); else if(c[z][0]==y)c[z][0]=x; else c[z][1]=x; fa[x]=z;fa[y]=x;fa[c[x][r]]=y; c[y][l]=c[x][r];c[x][r]=y; Pushup(y);Pushup(x);} void Splay(int x){ st.push(x); for(int i=x;!Pd_root(i);i=fa[i]) { st.push(fa[i]); } while(!st.empty()) { int now=st.top();st.pop(); Pushdown(now); } while(!Pd_root(x)) { int y=fa[x],z=fa[y]; if(!Pd_root(y)) { if(c[y][0]==x^c[z][0]==y) Rotate(x); else Rotate(y); } Rotate(x); }} void Access(int x){ for(int t=0;x;t=x,x=fa[x]) Splay(x),c[x][1]=t,Pushup(x);} void Move_to_root(int x){ Access(x);Splay(x);Rev[x]^=1;} void Join(int x,int y){ Move_to_root(x);fa[x]=y;} void Cut(int x,int y){ Move_to_root(x);Access(y);Splay(y); fa[x]=0;c[y][0]=0; Pushup(y);} void Split(int x,int y){ Move_to_root(x);Access(y);Splay(y);} int main(){ n=read(); for(int i=1;i<=n+1;i++) size[i]=1; for(int i=1;i<=n;i++) { int x=read(); if(i+x>n) fa[i]=n+1,Next[i]=n+1; else fa[i]=i+x,Next[i]=i+x; } m=read(); for(int i=1;i<=m;i++) { int kind=read(); if(kind==1) { int x=read()+1; Move_to_root(n+1);Access(x);Splay(x); printf("%d\n",size[c[x][0]]); } else { int x=read()+1,y=read(); if(x+y>n) y=n+1; else y=x+y; Cut(x,Next[x]);Join(x,y); Next[x]=y; } } return 0;}
0 0
- BZOJ2002弹飞绵羊
- 【bzoj2002】弹飞绵羊
- bzoj2002 弹飞绵羊
- 【BZOJ2002】弹飞绵羊
- bzoj2002 弹飞绵羊
- [bzoj2002]弹飞绵羊
- BZOJ2002弹飞绵羊
- bzoj2002弹飞绵羊
- 【BZOJ2002】弹飞绵羊
- 【bzoj2002】弹飞绵羊
- BZOJ2002弹飞绵羊
- BZOJ2002弹飞绵羊
- BZOJ2002-弹飞绵羊 LCT
- 【bzoj2002】【LCT】弹飞绵羊
- bzoj2002 弹飞绵羊2
- 【bzoj2002】弹飞绵羊 LCT
- [HNOI2010][BZOJ2002]弹飞绵羊
- [bzoj2002][LCT]弹飞绵羊
- Android开发 调用照相机实现代码和注意事项
- linux下TCP/IP实现简单聊天程序
- android空指针异常
- Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现
- 毕业季不悔
- bzoj2002 弹飞绵羊
- 移动端常用的数据交互格式有xml和json两种方式
- 数据结构:队列的概念和实现
- Android多线程异步处理:AsyncTask 的实现原理
- 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost
- openstack 中国联盟公开课参会总结
- android LayoutInflater.inflate()的参数及其用法
- 路径规划-人工势场法(Artifical Potential Field)
- Commit message 和 Change log 编写指南