bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊
2016-09-15 13:25
253 查看
2002: [Hnoi2010]Bounce 弹飞绵羊
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 8562 Solved: 4385
[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
【分析】
这道题用分块,但用的很巧啊…
首先咱们考虑一下如果没有修改的话,是不是O(n)扫一遍就出解了…
但是有修改…一修改就要跑一遍O(n)…纯作死
那我们分块,用两个数组out和whe,out表示从当前点再跳几步能跳出当前块,whe记录跳到下一块的哪个点…就可以模拟了。虽然查询变成了O(sqrt(n))的复杂度…但修改也只修改当前的块,复杂度也是sqrt(n)
总复杂度 O(m*sqrt(n))
【代码】
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 8562 Solved: 4385
[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
【分析】
这道题用分块,但用的很巧啊…
首先咱们考虑一下如果没有修改的话,是不是O(n)扫一遍就出解了…
但是有修改…一修改就要跑一遍O(n)…纯作死
那我们分块,用两个数组out和whe,out表示从当前点再跳几步能跳出当前块,whe记录跳到下一块的哪个点…就可以模拟了。虽然查询变成了O(sqrt(n))的复杂度…但修改也只修改当前的块,复杂度也是sqrt(n)
总复杂度 O(m*sqrt(n))
【代码】
//【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define fo(i,j,k) for(i=j;i<=k;i++) using namespace std; int n,m,k,Q; int a[2000005],be[2000005],out[2000005],whe[2000005],lef[500],rig[500]; //out记录再走几步出块,whe记录出块后到达的点。 inline int read() { int x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline int ask(int x) { int i,j,ans=0; while(x<=n) ans+=out[x],x=whe[x]; return ans; } inline void change(int x,int v) { int i,j; int tmp=be[x],l=lef[tmp],r=rig[tmp]; a[x]=x+v; if(a[x]>r) out[x]=1,whe[x]=a[x]; else out[x]=out[a[x]]+1,whe[x]=whe[a[x]]; for(i=x-1;i>=l;i--) if(a[i]<=x) out[i]=out[a[i]]+1,whe[i]=whe[a[i]]; } int main() { int i,j; n=read(); int x=sqrt(n); fo(i,1,n) { a[i]=read(); whe[i]=a[i]+i; a[i]=whe[i]; } fo(i,1,x) lef[i]=rig[i-1]+1,rig[i]=i*x; rig[x]=n; fo(i,1,x) fo(j,lef[i],rig[i]) be[j]=i; for(i=n;i>=1;i--) { if(whe[i]>rig[be[i]]) out[i]=1; else out[i]=out[whe[i]]+1,whe[i]=whe[whe[i]]; } Q=read(); while(Q--) { int tmp; tmp=read(); if(tmp==1) { m=read();m++; printf("%d\n",ask(m)); } else { m=read();m++; k=read(); change(m,k); } } return 0; }
相关文章推荐
- _bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊(LCT裸题)
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 动态树
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊( LCT )
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊 (LCT)
- 初识lct——洛谷p3203 bzoj2002 [HNOI2010]BOUNCE 弹飞绵羊
- 【LCT】BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊
- BZOJ_2002_[Hnoi2010]Bounce 弹飞绵羊_LCT
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊
- bzoj2002: [Hnoi2010]Bounce 弹飞绵羊
- 【BZOJ】2002 [Hnoi2010]Bounce 弹飞绵羊 LCT
- [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊:分块|LCT
- BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊(分块)
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
- 【LCT】BZOJ2002(Hnoi2010)[Bounce 弹飞绵羊]题解
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
- 【bzoj2002】 Hnoi2010—Bounce 弹飞绵羊
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】