BZOJ 2002 分块
来源:互联网 发布:淘宝装修店铺视频教程 编辑:程序博客网 时间:2024/05/02 04:55
2002: [Hnoi2010]Bounce 弹飞绵羊
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 9894 Solved: 5099
[Submit][Status][Discuss]
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
每个点记录跳出分块的步数以及跳到下一分块的哪个点。。。
代码来自这里:
http://hzwer.com/3505.html
#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=200005;int n,m,block,cnt;int k[maxn],belong[maxn],st[maxn],go[maxn];int l[maxn],r[maxn];int cal(int x){ int temp=0; while(1){ if(!x)break; temp+=st[x]; x=go[x]; } return temp;}int main(){ scanf("%d",&n); block=sqrt(n); if(n%block){ cnt=n/block+1; } else cnt=n/block; for(int i=1;i<=cnt;i++){ l[i]=(i-1)*block+1,r[i]=i*block; } r[cnt]=n; for(int i=1;i<=n;i++){ belong[i]=(i-1)/block+1; } for(int i=1;i<=n;i++){ scanf("%d",k+i); } for(int i=n;i>=1;i--){ if(i+k[i]>n){ st[i]=1; go[i]=0; } else if(belong[i]==belong[i+k[i]]){ st[i]=st[i+k[i]]+1; go[i]=go[i+k[i]]; } else { st[i]=1; go[i]=i+k[i]; } } scanf("%d",&m); int x,y,z; while(m--){ scanf("%d",&x); if(x==1){ scanf("%d",&y); y++; printf("%d\n",cal(y)); } else { scanf("%d%d",&y,&z); y++; k[y]=z; for(int i=y;i>=l[belong[y]];i--){ if(belong[i]==belong[i+k[i]]){ st[i]=st[i+k[i]]+1; go[i]=go[i+k[i]]; } else { st[i]=1; go[i]=i+k[i]; } } } } return 0;}
- BZOJ 2002 分块
- BZOJ 2002 分块
- BZOJ 2002 分块
- BZOj 2002 分块
- BZOJ 2002 分块
- BZOJ 2002 HNOI2010 弹飞绵羊 分块
- BZOJ-2002-Bounce弹飞绵羊-分块
- 【BZOJ】2002 弹飞绵羊 分块
- BZOJ 2002 Hnoi2010 弹飞绵羊 分块
- bzoj 2002 弹飞绵羊 分块
- BZOJ 2002 Bounce 弹飞绵羊 [分块]
- bzoj 2002 弹飞绵羊 分块
- BZOJ 2002 弹飞绵羊 分块
- 弹飞绵羊 bzoj 2002 分块
- bzoj 2453 && bzoj 2120 分块
- BZOJ 2141 排队 分块
- bzoj 3343(分块)
- bzoj 2453(分块)
- PAT-B 1040. 有几个PAT(25)
- HDU 5978 To begin or not to begin(概率)
- Vue.js学习系列(三十二)-- Vue.js样式绑定(三)
- 大数据工程师(开发)面试系列(5)
- maven SpringMVC,Spring,Mybatis整合
- BZOJ 2002 分块
- 23种设计模式分析(1):创建型模式
- TypeLite(二)-- 编写生成器
- 第三章 字符串、向量和数组(重点)
- 【Java集合源码剖析】LinkedHashmap源码剖析
- 华为OJ训练之0033-170111-识别有效的IP地址和掩码并进行分
- Google开源SLAM软件cartographer中使用的UKF滤波器解析
- PAT-A 1093. Count PAT's (25)
- 2017湖南多校第三场A(1025): Lawn mower