【bzoj 4764】弹飞大爷
Description
Input
Output
Sample Input
3 19
1 1 1
1 1
1 2
1 3
2 1 2
1 1
1 2
1 3
2 3 -1
1 1
1 2
1 3
2 2 233
1 1
1 2
1 3
2 2 -233
1 1
1 2
1 3
Sample Output
3
2
1
2
2
1
-1
-1
-1
3
1
2
3
1
2
调了两天终于A了……万分感谢czl大爷、cyc大爷和yy大爷。
RE了几发之后一直调不出来,心态爆炸开始乱搞,然后就WA了。怪我自己没有理解好写法。
因为有环,所以需要隐藏环上的一条边来使其成为森林,hl数组与hr数组即代表隐藏边的端点。
剩下的直接上代码……
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=200050; 6 int n,m,t,u,v,a[N],hl[N],hr[N],st[N]; 7 struct node{int fa,c[2],s;bool rev;}tr[5*N]; 8 int read() 9 { 10 int x=0,f=1;char c=getchar(); 11 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 12 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} 13 return x*f; 14 } 15 bool isroot(int k){return !k||!tr[k].fa||(tr[tr[k].fa].c[0]!=k&&tr[tr[k].fa].c[1]!=k);} 16 void up(int k){tr[k].s=tr[tr[k].c[0]].s+tr[tr[k].c[1]].s+1;} 17 void down(int k) 18 { 19 int l=tr[k].c[0],r=tr[k].c[1]; 20 if(tr[k].rev) 21 { 22 tr[k].rev^=1;tr[l].rev^=1;tr[r].rev^=1; 23 swap(tr[k].c[0],tr[k].c[1]); 24 } 25 if(l)hl[l]=hl[k],hr[l]=hr[k]; 26 if(r)hl[r]=hl[k],hr[r]=hr[k]; 27 } 28 void rotate(int x) 29 { 30 int y=tr[x].fa,z=tr[y].fa,l,r; 31 if(tr[y].c[0]==x)l=0;else l=1;r=l^1; 32 if(!isroot(y)){if(tr[z].c[0]==y)tr[z].c[0]=x;else tr[z].c[1]=x;} 33 tr[x].fa=z;tr[y].fa=x;tr[tr[x].c[r]].fa=y; 34 tr[y].c[l]=tr[x].c[r];tr[x].c[r]=y; 35 up(y);up(x); 36 } 37 void splay(int x) 38 { 39 int top=0;st[++top]=x; 40 for(int i=x;!isroot(i);i=tr[i].fa)st[++top]=tr[i].fa; 41 for(int i=top;i;i--)down(st[i]); 42 while(!isroot(x)) 43 { 44 int y=tr[x].fa,z=tr[y].fa; 45 if(!isroot(y)) 46 { 47 if((tr[y].c[0]==x)^(tr[z].c[0]==y))rotate(x); 48 else rotate(y); 49 } 50 rotate(x); 51 } 52 } 53 void acs(int x) 54 { 55 int t=0; 56 while(x){splay(x);tr[x].c[1]=t;up(x);t=x;x=tr[x].fa;} 57 } 58 void mkroot(int x){acs(x);splay(x);tr[x].rev^=1;} 59 int find(int x){acs(x);splay(x);while(tr[x].c[0])x=tr[x].c[0];return x;} 60 void link(int x,int y){mkroot(x);tr[x].fa=y;acs(x);splay(x);} 61 void cut(int x,int y) 62 { 63 mkroot(x);acs(y);splay(y); 64 tr[x].fa=tr[y].c[0]=0;up(y); 65 hl[x]=hr[x]=hl[y]=hr[y]=0; 66 } 67 void xlink(int x,int y) 68 { 69 if(find(x)==find(y))hl[y]=x,hr[y]=y; 70 else link(x,y); 71 } 72 void xcut(int x,int y) 73 { 74 acs(x);splay(x);int li=hl[x],ri=hr[x]; 75 if(hl[x]==x&&hr[x]==y)hl[x]=hl[y]=hr[x]=hr[y]=0; 76 else 77 { 78 cut(x,y); 79 if(li&&ri)xlink(li,ri);//划重点!xlink而不是link。 80 } 81 } 82 int query(int x) 83 { 84 mkroot(n+1);acs(x);splay(x); 85 if(hl[x]&&hr[x])return -1; 86 return tr[x].s-1; 87 } 88 int main() 89 { 90 n=read();m=read(); 91 for(int i=1;i<=n+1;i++)tr[i].s=1; 92 for(int i=1;i<=n;i++) 93 { 94 a[i]=read(); 95 if(i+a[i]<=0||i+a[i]>n)link(i,n+1); 96 else xlink(i,i+a[i]); 97 } 98 while(m--) 99 { 100 t=read(); 101 if(t==1)u=read(),printf("%d\n",query(u)); 102 else 103 { 104 u=read();v=read(); 105 if(u+a[u]<=0||u+a[u]>n)cut(u,n+1); 106 else xcut(u,u+a[u]); 107 if(u+v<=0||u+v>n)link(u,n+1); 108 else xlink(u,u+v); 109 a[u]=v; 110 } 111 } 112 return 0; 113 }
View Code
转载于:https://www.cnblogs.com/zsnuo/p/7091464.html
【bzoj 4764】弹飞大爷相关推荐
- 【BZOJ4764】弹飞大爷 LCT
[BZOJ4764]弹飞大爷 Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列.这个序列 ...
- 弹飞大爷 BZOJ4764 LCT维护内向基环树森林
https://winniechen.cn/?p=99 转载于:https://www.cnblogs.com/Winniechen/p/9302972.html
- 【bzoj 2002】弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 10761 Solved: 5542 [Su ...
- bzoj 2002 Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 时间限制: 10 Sec 内存限制: 259 MB 提交: 16133 解决: 8253 题目描述 某天,Lostmonkey发明了一种 ...
- BZOJ 2002 Bounce 弹飞绵羊 [Hnoi2010]
弹飞绵羊 题目的网址为: http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题目大意 有N个点,每个点有一个系数a[i],你处于位置i可以走到i ...
- 【HNOI 2010】Bounce 弹飞绵羊 分块
BZOJ Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置 ...
最新文章
- 基于ASP.NET的comet简单实现
- 微软程序员利用测试账户套现千万美元,或面临 20 年监禁
- mysql 原生 添加数据_手撸Mysql原生语句--增删改查
- 年度迷惑新闻:美女其实是个男生?
- 【英语学习】【Level 08】U03 My Choice L2 All-time favorite character
- macOS安装mysql后,进入mysql出现command not found
- pandas to_sql
- c++ windows 光标操作_电脑操作常用快捷键
- 澎思科技获洪泰基金千万级天使轮融资,深耕AI+安防行业
- DB2 开发系列 从入门开始--概述
- pr.exe、Churrasco.exe、ms10048.exe用法及提权原理 上帝模式
- 图像处理之图像质量评价指标SSIM(结构相似性)
- 找特征点的算法 SIFT和SURF算法
- 机器学习之决策树CART算法
- 红与黑题解(深搜入门ing)
- Android平台下JNI调用第三方so库
- @slf4j日志格式配置
- [WinError 10060]错误
- 关于颜色HSL(色度、饱和度、亮度)
- TCGA数据下载方法简介