原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002

弹飞绵羊

Description

某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

Input

第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,接下来一行有n个正整数,依次为那n个装置的初始弹力系数。第三行有一个正整数m,接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000

Output

对于每个i=1的情况,你都要输出一个需要的步数,占一行。

Sample Input

4
1 2 1 1
3
1 1
2 1 1
1 1

Sample Output

2
3

题解

省选考了道LCT\mathcal{LCT}LCT,博主就学了一发,这道题的LCT\mathcal{LCT}LCT思路还是很简单的。

我们对于每个点与它能跳到的点连一条边,而弹出去的点都连到n+1n+1n+1节点(即root\mathcal{root}root)上。修改的时候直接减掉原来的边,重新连一条就好了。对于查询操作,直接将它与root\mathcal{root}root的链拉出来求一下size\mathcal{size}size就好了。

对于已经会LCT\mathcal{LCT}LCT的同学,这些应该都是基本操作吧。。。

另外,因为常数太大,LCT\mathcal{LCT}LCT比分块要慢一点。。。

代码

注意初始化

#include<bits/stdc++.h>
#define ls son[v][0]
#define rs son[v][1]
using namespace std;
const int M=2e5+5;
int n,m,root,dad[M],siz[M],spr[M],sta[M],son[M][2];
bool rev[M];
bool notroot(int v){return son[dad[v]][0]==v||son[dad[v]][1]==v;}
void up(int v){siz[v]=siz[ls]+siz[rs]+1;}
void turn(int v){swap(ls,rs);rev[v]^=1;}
void push(int v){if(!rev[v])return;if(ls)turn(ls);if(rs)turn(rs);rev[v]=0;}
void spin(int v)
{int f=dad[v],ff=dad[f],k=son[f][1]==v,w=son[v][!k];if(notroot(f))son[ff][son[ff][1]==f]=v;son[v][!k]=f;son[f][k]=w;if(w)dad[w]=f;dad[f]=v;dad[v]=ff;up(f);up(v);
}
void splay(int v)
{int u=v,f,ff,top=0;sta[++top]=u;while(notroot(u))sta[++top]=u=dad[u];while(top)push(sta[top--]);while(notroot(v)){f=dad[v],ff=dad[f];if(notroot(f))spin((son[f][0]==v)^(son[ff][0]==f)?v:f);spin(v);}up(v);
}
void access(int v){for(int f=0;v;v=dad[f=v])splay(v),rs=f,up(v);}
void beroot(int v){access(v);splay(v);turn(v);}
int findroot(int v){access(v);splay(v);while(ls)push(v),v=ls;return v;}
void split(int a,int b){beroot(a);access(b);splay(b);}
void link(int a,int b){beroot(a);if(findroot(b)!=a)dad[a]=b;}
void cut(int v,int y){beroot(v);if(findroot(y)==v&&dad[v]==y)dad[v]=son[y][0]=0,up(y);}
void in()
{scanf("%d",&n);root=n+1;for(int i=1+n;i>=1;--i)siz[i]=1;for(int i=1;i<=n;++i)scanf("%d",&spr[i]),link(i,min(i+spr[i],root));
}
void ac()
{int op,a,b;scanf("%d",&m);for(int i=1;i<=m;++i){scanf("%d%d",&op,&a);a+=1;if(op==1)split(root,a),printf("%d\n",siz[a]-1);else scanf("%d",&b),cut(min(a+spr[a],root),a),spr[a]=b,link(a,min(a+spr[a],root));}
}
int main()
{in();ac();return 0;
}

BZOJ2002[HNOI2010] 弹飞绵羊(LCT)相关推荐

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

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

  2. BZOJ2002 [HNOI2010] 弹飞绵羊

    LCT access完了一定splay再用!!! 悲伤= = LCT裸题 把调出去设虚点n+1即可 //Love and Freedom. #include<cstdio> #includ ...

  3. P3203 [HNOI2010]弹飞绵羊

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

  4. [HNOI2010]弹飞绵羊

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

  5. 【codevs2333】【BZOJ2002】弹飞绵羊,第一次的LCT

    传送门1 传送门2 写在前面:开始种树 思路:分块 or LCT,主要结合了黄学长的模版,同时感谢char哥.Yveh.Shallwe的帮助,做法什么的建议大家还是去网上找,有很多神犇讲解得不错,蒟蒻 ...

  6. luogu P3203 [HNOI2010]弹飞绵羊(LCT ? 暴力分块 ! )

    整理的算法模板合集: ACM模板 已知:暴力 + 暴力 + 10510^5105 = 分块 设 need[i] 表示从 i 开始,跳出所在块的步数:ver[i] 表示跳出当前所在的块后到了哪里: 罗老 ...

  7. BZOJ 2002 HNOI2010 弹飞绵羊 分块

    题目大意及LCT版本题解:见 http://blog.csdn.net/popoqqq/article/details/38849471 今天手滑用分块又重写了一遍这道题0.0 分块就是短啊 将弹簧分 ...

  8. 【动态树】[BZOJ2002] Bounce 弹飞绵羊

    实际上就是动态树的模版加上一个维护每一条链的size这样就可以吧一次弹射看成一条路径,然后统计这个路径上的size实际上就是经过了多少个节点然后没什么了.. #include <bits/std ...

  9. BZOJ P2002 [HNOI2010] 弹飞绵羊【分块】

    这道题就很优秀了.考试的时候完全没想到正解,最后写了一个暴力20分- 直接讲分块吧.我们预处理两个数组 S t e p [ ] , G e t [ ] Step[],Get[] Step[],Get[ ...

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

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

最新文章

  1. Xamarin图表开发基础教程(2)OxyPlot框架
  2. juniper交换机 mac地址和端口绑定
  3. php把年份转为int,PHP将DateInterval转换为int
  4. z490 linux raid,华硕z490主板装win7系统及bios设置教程(支持10代usb驱动)
  5. java socket 异步回调函数,分享nodejs异步编程基础之回调函数用法
  6. 领酌酒业:一文阅尽酱香酒
  7. CMake 手册详解(七)
  8. 关于电子通信的一些概念
  9. 淘宝登录破解(滑动验证码破解,淘宝登录环境检测破解)
  10. 编程设计模式中委托 和代理模式的区别
  11. 内网,外网ip(路由器ip,公网ip)的分别以及如何查询
  12. Meltdown Reading Kernel Memory from User Space
  13. Linux centOS 修改欢迎界面
  14. SpringCloud客户端Client启动时自动停止
  15. npm WARN unmet dependency错误解决方法
  16. 任何一个二目关系都是BCNF
  17. 企业网站怎么制作?企业网站制作,只需记住这8个步骤
  18. php数据库内容在漂亮表格呈现
  19. 新概念1 0--12
  20. 一个想法:成立草根技术联盟对开发人员进行技术定级解决企业员工招聘难问题!

热门文章

  1. wireshark过滤指定ip的数据包
  2. chrome.storage和window.localStorage的区别
  3. 二十一、 Memento 备忘录(行为型模式)
  4. 安装最新LAMP环境(CentOS7+PHP7.1.5+Mysql5.7)
  5. php dom 分离html内容
  6. dubbo 运行过程
  7. objC 类名后圆括号的意义
  8. oracle在cmd中启动数据库实例
  9. MQ方法解决分布式事务图
  10. java项目中遇到的幂等性问题