bzoj 2002 弹飞绵羊 分块 解题报告
来源:互联网 发布:命中注定网络歌曲 编辑:程序博客网 时间:2024/05/22 09:07
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
思路
分块,pt【跳一次的位置】,st【跳出块需要多少步】。然后看看是不是出块了,分情况更新值。具体看代码吧,显而易见的。。。
代码
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int N=200000+5;int n,m,num,now,lf[N],rt[N],belong[N],st[N],pt[N],line[N];int calcu(int x){ int t=0; while(true) { t+=st[x]; if (pt[x]==0) break; x=pt[x]; } return t;}int main(){ scanf("%d",&n); now=sqrt(n); for (int i=1;i<=n;i++) scanf("%d",&line[i]); if (n%now==1) num=n/now+1; else num=n/now; for (int i=1;i<=num;i++) { lf[i]=(i-1)*now+1; rt[i]=i*now; } rt[num]=n; for (int i=1;i<=n;i++) belong[i]=(i-1)/now+1; for (int i=n;i>0;i--) { if (i+line[i]>n) st[i]=1; else if (belong[i]==belong[i+line[i]]) { st[i]=st[i+line[i]]+1; pt[i]=pt[i+line[i]]; } else { st[i]=1; pt[i]=i+line[i]; } } scanf("%d",&m); for (int i=1;i<=m;i++) { int x,y,f; scanf("%d%d",&f,&x); x++; if (f==1) printf("%d\n",calcu(x)); else { scanf("%d",&y); line[x]=y; for (int i=x;i>=lf[belong[x]];i--) if (belong[i]==belong[i+line[i]]) { st[i]=st[i+line[i]]+1; pt[i]=pt[i+line[i]]; } else { st[i]=1; pt[i]=i+line[i]; } } } return 0;}
阅读全文
2 0
- bzoj 2002 弹飞绵羊 分块 解题报告
- BZOJ 2002 HNOI2010 弹飞绵羊 分块
- BZOJ-2002-Bounce弹飞绵羊-分块
- 【BZOJ】2002 弹飞绵羊 分块
- BZOJ 2002 Hnoi2010 弹飞绵羊 分块
- bzoj 2002 弹飞绵羊 分块
- BZOJ 2002 Bounce 弹飞绵羊 [分块]
- bzoj 2002 弹飞绵羊 分块
- BZOJ 2002 弹飞绵羊 分块
- 弹飞绵羊 bzoj 2002 分块
- BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊 解题报告【数据结构】【分块】
- BZOJ 2002 Bounce 弹飞绵羊(分块|暴力|)(困难)
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊|分块
- BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)
- bzoj 2002 弹飞绵羊 分块(水)
- bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊 [分块][特殊处理]
- Bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
- C++的重载、覆盖和遮蔽(隐藏)
- 中位数与顺序统计量
- Python网络爬虫
- lintcode--组合
- SQL脚本osql不是内部或外部命令 也不是可运行的程序或批处理文件
- bzoj 2002 弹飞绵羊 分块 解题报告
- 用户和文件权限
- js时间格式化
- python-异常
- socket详解
- Elasticsearch模块功能之-自动发现(Discovery)
- 期权:Black-Scholes put and call option pricing
- selenium新建标签页面
- Java_基础—异常的概述和分类/JVM默认处理异常的方式