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

调了两天终于A了……万分感谢czl大爷、cyc大爷和yy大爷。

RE了几发之后一直调不出来,心态爆炸开始乱搞,然后就WA了。怪我自己没有理解好写法。

因为有环,所以需要隐藏环上的一条边来使其成为森林,hl数组与hr数组即代表隐藏边的端点。

剩下的直接上代码……

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int n,m,t,u,v,a[N],hl[N],hr[N],st[N];
struct node{int fa,c[],s;bool rev;}tr[*N];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
bool isroot(int k){return !k||!tr[k].fa||(tr[tr[k].fa].c[]!=k&&tr[tr[k].fa].c[]!=k);}
void up(int k){tr[k].s=tr[tr[k].c[]].s+tr[tr[k].c[]].s+;}
void down(int k)
{
int l=tr[k].c[],r=tr[k].c[];
if(tr[k].rev)
{
tr[k].rev^=;tr[l].rev^=;tr[r].rev^=;
swap(tr[k].c[],tr[k].c[]);
}
if(l)hl[l]=hl[k],hr[l]=hr[k];
if(r)hl[r]=hl[k],hr[r]=hr[k];
}
void rotate(int x)
{
int y=tr[x].fa,z=tr[y].fa,l,r;
if(tr[y].c[]==x)l=;else l=;r=l^;
if(!isroot(y)){if(tr[z].c[]==y)tr[z].c[]=x;else tr[z].c[]=x;}
tr[x].fa=z;tr[y].fa=x;tr[tr[x].c[r]].fa=y;
tr[y].c[l]=tr[x].c[r];tr[x].c[r]=y;
up(y);up(x);
}
void splay(int x)
{
int top=;st[++top]=x;
for(int i=x;!isroot(i);i=tr[i].fa)st[++top]=tr[i].fa;
for(int i=top;i;i--)down(st[i]);
while(!isroot(x))
{
int y=tr[x].fa,z=tr[y].fa;
if(!isroot(y))
{
if((tr[y].c[]==x)^(tr[z].c[]==y))rotate(x);
else rotate(y);
}
rotate(x);
}
}
void acs(int x)
{
int t=;
while(x){splay(x);tr[x].c[]=t;up(x);t=x;x=tr[x].fa;}
}
void mkroot(int x){acs(x);splay(x);tr[x].rev^=;}
int find(int x){acs(x);splay(x);while(tr[x].c[])x=tr[x].c[];return x;}
void link(int x,int y){mkroot(x);tr[x].fa=y;acs(x);splay(x);}
void cut(int x,int y)
{
mkroot(x);acs(y);splay(y);
tr[x].fa=tr[y].c[]=;up(y);
hl[x]=hr[x]=hl[y]=hr[y]=;
}
void xlink(int x,int y)
{
if(find(x)==find(y))hl[y]=x,hr[y]=y;
else link(x,y);
}
void xcut(int x,int y)
{
acs(x);splay(x);int li=hl[x],ri=hr[x];
if(hl[x]==x&&hr[x]==y)hl[x]=hl[y]=hr[x]=hr[y]=;
else
{
cut(x,y);
if(li&&ri)xlink(li,ri);//划重点!xlink而不是link。
}
}
int query(int x)
{
mkroot(n+);acs(x);splay(x);
if(hl[x]&&hr[x])return -;
return tr[x].s-;
}
int main()
{
n=read();m=read();
for(int i=;i<=n+;i++)tr[i].s=;
for(int i=;i<=n;i++)
{
a[i]=read();
if(i+a[i]<=||i+a[i]>n)link(i,n+);
else xlink(i,i+a[i]);
}
while(m--)
{
t=read();
if(t==)u=read(),printf("%d\n",query(u));
else
{
u=read();v=read();
if(u+a[u]<=||u+a[u]>n)cut(u,n+);
else xcut(u,u+a[u]);
if(u+v<=||u+v>n)link(u,n+);
else xlink(u,u+v);
a[u]=v;
}
}
return ;
}

【bzoj 4764】弹飞大爷的更多相关文章

  1. BZOJ 4764: 弹飞大爷

    4764: 弹飞大爷 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 4  Solved: 4[Submit][Status][Discuss] Des ...

  2. BZOJ 4764: 弹飞大爷 LCT

    思路并不难,主要是细节需要注意一下. 在 lct 中,删边要写成:f[lson]=0,lson=0 (因为删 x->y 时 y 不一定是左儿子,y 只是 x 的前驱) 然后 f[lson]=ls ...

  3. 【BZOJ】4764: 弹飞大爷 LCT

    [题意]给定n个数字ai,表示大爷落到i处会被弹飞到i+ai处,弹飞到>n或<1处则落地.m次操作,修改一个ai,或询问大爷落到x处经过几次落地(或-1).n,m<=10^5,|ai ...

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

    4764: 弹飞大爷 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 101  Solved: 52[Submit][Status][Discuss] ...

  5. 【BZOJ4764】弹飞大爷 LCT

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

  6. BZOJ4764弹飞大爷——LCT

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

  7. bzoj4764: 弹飞大爷

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

  8. [bzoj] 2002 弹飞绵羊 || LCT

    原题 简单的LCT练习题. 我们发现对于一个位置x,他只能跳到位置x+k,也就是唯一的父亲去.加入我们将弹飞的绵羊定义为跳到了n+1,那么这就形成了一棵树.而因为要修改k,所以这颗树是动态连边的,那么 ...

  9. bzoj 2002: 弹飞绵羊 Link-Cut-Tree

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

随机推荐

  1. linux防火墙,高级策略策略实例详解(实例一)

    双线服务器的控制问题: 要求:写出这个电信用户访问到双线web服务器时的IP变化过程(只写源IP,目标IP,和做SNAT还是DNAT等) 你觉得有没有问题? 实验环境: 精简一点可以使用下面的四台虚拟 ...

  2. QML-关于Qt.rgba()颜色无法正常显示问题

    GitHub:八至 作者:狐狸家的鱼 本文链接:关于Qt.rgba()颜色的正确写法 当在正常给color属性写颜色的时候,用十六进制能正常显示,但是用Qt.rgba()时,颜色无法正常显示出来. 按 ...

  3. Vue--组件嵌套

    1.全局注册: 组件放到components文件夹内,建议组件名是什么行为的name名就是什么 main.js 引入组件:import Users from '组件位置' 注册全局组件:Vue.com ...

  4. A1144. The Missing Number

    Given N integers, you are supposed to find the smallest positive integer that is NOT in the given li ...

  5. react-native中的props

    效果图 大多数组件在创建时就可以使用各种参数来进行定制.用于定制的这些参数就称为props(属性). 以常见的基础组件Image为例,在创建一个图片时,可以传入一个名为source的 prop 来指定 ...

  6. “adb不是内部或外部命令,也不是可运行的程序或批量文件“

    首先这个问题有两种可能: 1.就是没有配置环境变量, 这个只需要将android安装:例如C:\Program File\android-sdk-windows\tools加入到 系统变量Path中, ...

  7. Codeforces Round #523 (Div. 2) B Views Matter

    传送门 https://www.cnblogs.com/violet-acmer/p/10005351.html 这是一道贪心题么???? 题意: 某展览馆展览一个物品,此物品有n堆,第 i 堆有a[ ...

  8. TODO java 作业-梭哈--待完成

    作业:定义一个类,该类用于封装一桌梭哈游戏,这个类应该包含桌上剩下的牌的信息,并包含5个玩家的状态的信息,他们各自的位置,游戏状态(正在游戏或已放弃),手上已有的牌等信息.如果有可能,这个类还应该实现 ...

  9. MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器

    ———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...

  10. 加了synchronized后还是不安全的问题

    1.查看是不是多线程 2.用的是不是同一个锁