【BZOJ4764】弹飞大爷 LCT
【BZOJ4764】弹飞大爷
Description
Input
Output
Sample Input
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
2
1
2
2
1
-1
-1
-1
3
1
2
3
1
2
题解:题中所给的显然是一片基环内向树森林,那么我们先不考虑环,用LCT维护所有树。新建一个点n+1,表示序列外面。在询问时,如果一个点的根不是n+1,则输出-1,否则输出那个点的深度即可。在修改时,我们需要进行如下分类讨论:
首先是拆开原来的边,如果原来的边是非树边,那么不用管,否则如果这条边是环上的边,那么我们要将环边link上。然后cut。
然后是连新边,如果新边已经连通,则不连,否则link。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=200010;
int n,m;
int to[maxn];
struct node
{int fa,ch[2],siz;
}s[maxn];
inline bool isr(int x) {return x!=s[s[x].fa].ch[0]&&x!=s[s[x].fa].ch[1];}
inline void pushup(int x)
{s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;
}
inline void rotate(int x)
{int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);if(!isr(y)) s[z].ch[y==s[z].ch[1]]=x;s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;s[x].ch[d^1]=y;pushup(y),pushup(x);
}
inline void splay(int x)
{while(!isr(x)){int y=s[x].fa,z=s[y].fa;if(!isr(y)){if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x);else rotate(y);}rotate(x);}
}
inline void access(int x)
{for(int y=0;x;splay(x),s[x].ch[1]=y,pushup(x),y=x,x=s[x].fa);
}
inline int findr(int x)
{access(x),splay(x);while(s[x].ch[0]) x=s[x].ch[0];return x;
}
inline int rd()
{int ret=0,f=1; char gc=getchar();while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd();int i,a,b;for(i=1;i<=n;i++) a=i+rd(),to[i]=(a>n||a<1)?n+1:a,s[i].siz=1;s[n+1].siz=1;for(i=1;i<=n;i++){if(findr(to[i])!=i) splay(i),s[i].fa=to[i];}for(i=1;i<=m;i++){if(rd()==1){a=rd(),b=findr(a);if(b!=n+1) printf("-1\n");else printf("%d\n",s[s[a].ch[0]].siz);}else{a=rd(),b=findr(a);s[s[a].ch[0]].fa=0,s[a].ch[0]=0,pushup(a);if(b!=n+1&&findr(to[b])!=b) splay(b),s[b].fa=to[b];b=a+rd(),to[a]=(b>n||b<1)?n+1:b;if(findr(to[a])!=a) splay(a),s[a].fa=to[a];/*s[s[a].ch[0]].fa=0,s[a].ch[0]=0,pushup(a);splay(b);if(b!=n+1&&a!=b&&findr(to[b])!=b) s[b].fa=to[b],splay(to[b]);b=a+rd(),to[a]=(b>n||b<1)?n+1:b;b=findr(to[a]),splay(b);if(b!=a) s[a].fa=to[a];*/}}return 0;
}//3 10 1 1 1 2 1 2 2 3 -1 2 2 233 1 1 1 2 1 3 2 2 -233 1 1 1 2 1 3
转载于:https://www.cnblogs.com/CQzhangyu/p/7898508.html
【BZOJ4764】弹飞大爷 LCT相关推荐
- 【bzoj 4764】弹飞大爷
Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小伙 ...
- HNOI2010——弹飞绵羊(lct)
某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当 ...
- 弹飞大爷 BZOJ4764 LCT维护内向基环树森林
https://winniechen.cn/?p=99 转载于:https://www.cnblogs.com/Winniechen/p/9302972.html
- 【bzoj 2002】弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- Bounce 弹飞绵羊
某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当 ...
- 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...
- P3203 [HNOI2010]弹飞绵羊
P3203 [HNOI2010]弹飞绵羊 题目描述 详见:P3203 [HNOI2010]弹飞绵羊 solution 这是一道LCT的裸题. 但是我并不想用LCT解决此题(In fact 是不会LCT ...
最新文章
- 兼容IE和火狐、crome的返回XML文件内容
- [mybatis]log4j
- 转载 Assert断言知识
- Unity3d gameObject
- 如何将Spring Bean注入到JSF Converter
- MySQL主从同步(一)——原理详解
- .net mysql 测试连接数据库连接,C#.NET连接mysql方法
- 第三届蓝桥杯省赛---马虎的算式
- java 回调函数实现_Java实现的回调函数
- matlab脉冲压缩,雷达线性调频脉冲压缩的原理及其matlab仿真
- 支付系统中的设计模式09:组合模式
- 怎样将一个Word表格拆分为两个
- 哥德尔预言无穷小微积分是未来的数学分析
- 新支点ICG聚合路由器在新闻发布会直播的应用方案
- 计算机水平一般良好怎么填,计算机水平一般怎么填
- Fuzzing论文_CONCURR COMP-PRACT E2020_Fw-fuzz
- sun公司:太阳的升起与衰落
- 关于垃圾文件ant、贝壳等弹窗广告的卸载问题
- 电影《这个杀手不太冷》观影感受
- 物联网中常用的方法,16进制二进制之间的转换