博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bounce(弹走绵羊)lct裸题
阅读量:6114 次
发布时间:2019-06-21

本文共 1996 字,大约阅读时间需要 6 分钟。

Bounce(弹走绵羊)

某天,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 31 12 1 11 1
Sample Output
23
#include
#include
#include
#include
#include
#include
using namespace std;const int maxn = 200000+11;int size[maxn],child[maxn][2],fa[maxn];void pushup(int x){ size[x]=size[child[x][0]]+size[child[x][1]]+1;}bool isroot(int x){ int y=fa[x]; return (child[y][0]!=x&&child[y][1]!=x);}void _rot(int x){ int y=fa[x],w=(child[y][1]==x); int g=fa[y]; if(!isroot(y)){ if(child[g][0]==y)child[g][0]=x; else if(child[g][1]==y)child[g][1]=x; } child[y][w]=child[x][w^1]; fa[child[x][w^1]]=y; child[x][w^1]=y; fa[x]=g; fa[y]=x; pushup(y);}void splay(int x){ while(!isroot(x)){ int y=fa[x],g=fa[y]; if(isroot(y)){ _rot(x); break; } if(!isroot(g))_rot(y); _rot(x); } pushup(x);}void accuss(int x){ int y=0; while(x){ splay(x); child[x][1]=y; pushup(x); y=x; x=fa[x]; }}void cut(int x){ accuss(x); splay(x); int l=child[x][0]; fa[l]=0; child[x][0]=0; pushup(x);}void link(int x,int y){ cut(x); fa[x]=y;}int main(){ int i,j,k,m,n; scanf("%d",&n); for(i=1;i<=n;i++)size[i]=1; for(i=1;i<=n;i++){ int val; scanf("%d",&val); if(i+val>n)fa[i]=0; else fa[i]=i+val; } size[0]=0; scanf("%d",&m); for(i=1;i<=m;i++){ int t; scanf("%d",&t); if(t==1){ int x; scanf("%d",&x); x++; accuss(x); splay(x); printf("%d\n",size[child[x][0]]+1); } else{ int x,y; scanf("%d%d",&x,&y); x++; if(x+y>n)link(x,0); else link(x,x+y); } } return 0;}

转载于:https://www.cnblogs.com/brodrinkwater/p/7527990.html

你可能感兴趣的文章
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>