【BZOJ4764】弹飞大爷

Description

自从WC退役以来,大爷是越来越懒惰了。为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列。这个序列共有N项,每项都代表了一个小伙伴的力量值,如果大爷落到了第i个小伙伴的手里,那么第i个小伙伴会把大爷弹到第i+ai个小伙伴手里,其中ai就是第i个小伙伴的力量值,也就是序列的第i项。然而,因为大爷太沉了,所以有些小伙伴不能撑到锻(you)炼(xi)结束,所以我们中途会替换一些小伙伴,也就是改变序列的某些项。而且,因为大爷太沉了,所以有些小伙伴不能把大爷扔向前方,而是会把大爷往反方向扔,也就是序列中的一些项会是负的(当然,也可能是零喽)。现在机智的大爷通过在空中的观察,已经知道小伙伴们的所有活动——即初始序列、所有更改操作,他想请你算一算,如果他在某时刻落到了某个位置,那么他会在几次弹起之后落到小伙伴序列之外(毕竟摔在地上还是蛮疼的)。

Input

第一行为两个整数N和M,代表序列长度和操作次数。
第二行为N个整数,代表初始的小伙伴序列。
接下来有M行,每行代表一个操作。
如果这一行的第一个数是1,代表该操作是一个询问操作,接下来一个数X,代表询问此时大爷从X处,经过几次弹起会摔在地上。如果永远不会摔在地上,请输出-1。
如果这一行的第一个数是2,代表该操作是一个更改操作,接下来两个数X,Y,代表将序列的第X项改为Y。
N,M <= 200000  |Ai| < N

Output

对于每次询问操作,输出弹起次数或-1。

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

题解:题中所给的显然是一片基环内向树森林,那么我们先不考虑环,用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相关推荐

  1. 【bzoj 4764】弹飞大爷

    Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小伙 ...

  2. HNOI2010——弹飞绵羊(lct)

    某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当 ...

  3. 弹飞大爷 BZOJ4764 LCT维护内向基环树森林

    https://winniechen.cn/?p=99 转载于:https://www.cnblogs.com/Winniechen/p/9302972.html

  4. 【bzoj 2002】弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  5. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...

  6. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  7. Bounce 弹飞绵羊

    某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当 ...

  8. 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...

  9. P3203 [HNOI2010]弹飞绵羊

    P3203 [HNOI2010]弹飞绵羊 题目描述 详见:P3203 [HNOI2010]弹飞绵羊 solution 这是一道LCT的裸题. 但是我并不想用LCT解决此题(In fact 是不会LCT ...

最新文章

  1. 兼容IE和火狐、crome的返回XML文件内容
  2. [mybatis]log4j
  3. 转载 Assert断言知识
  4. Unity3d gameObject
  5. 如何将Spring Bean注入到JSF Converter
  6. MySQL主从同步(一)——原理详解
  7. .net mysql 测试连接数据库连接,C#.NET连接mysql方法
  8. 第三届蓝桥杯省赛---马虎的算式
  9. java 回调函数实现_Java实现的回调函数
  10. matlab脉冲压缩,雷达线性调频脉冲压缩的原理及其matlab仿真
  11. 支付系统中的设计模式09:组合模式
  12. 怎样将一个Word表格拆分为两个
  13. 哥德尔预言无穷小微积分是未来的数学分析
  14. 新支点ICG聚合路由器在新闻发布会直播的应用方案
  15. 计算机水平一般良好怎么填,计算机水平一般怎么填
  16. Fuzzing论文_CONCURR COMP-PRACT E2020_Fw-fuzz
  17. sun公司:太阳的升起与衰落
  18. 关于垃圾文件ant、贝壳等弹窗广告的卸载问题
  19. 电影《这个杀手不太冷》观影感受
  20. 物联网中常用的方法,16进制二进制之间的转换

热门文章

  1. win10 安装microsoft.net framework3.5
  2. Python 网络爬虫 001 (科普) 网络爬虫简介
  3. CoreData和SQLite多线程访问时的线程安全问题
  4. Perl中的单行凝视和多行凝视
  5. 不同存储区域的数组分析
  6. ATC打ABC142有感
  7. (1)opencv的安装和遇到的问题
  8. MongoDB在windows服务器安装部署及远程连接MongoDB
  9. 模块20135304——刘世鹏
  10. 中文 iOS/Mac 开发博客列表