【Hnoi2010】Bzoj2002 Bounce & Codevs2333 弹飞绵羊
2016-09-25 23:04
351 查看
Position:
http://www.lydsy.com/JudgeOnline/problem.php?id=3143
http://codevs.cn/problem/2333/
1 2 1 1
3
1 1
2 1 1
1 1
3
坑那~这题下标从零开始(异世界生活)
采用分块算法。对于每一点记录跳多少步可以跳出当前块,并且会跳到下一(几)块的哪个,update:c[x]=c[a[x]+x]+1(每次更新时只要更新当前块的第一个点到这个点的值,因为这个点的修改不会的其他块和后面的块造成影响);src:只要跳块就行了.
复杂度:O(m*sqrt(n))
http://www.lydsy.com/JudgeOnline/problem.php?id=3143
http://codevs.cn/problem/2333/
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<=100000Output
对于每个i=1的情况,你都要输出一个需要的步数,占一行。Sample Input
41 2 1 1
3
1 1
2 1 1
1 1
Sample Output
23
Solution
坑那~这题下标从零开始(异世界生活)
采用分块算法。对于每一点记录跳多少步可以跳出当前块,并且会跳到下一(几)块的哪个,update:c[x]=c[a[x]+x]+1(每次更新时只要更新当前块的第一个点到这个点的值,因为这个点的修改不会的其他块和后面的块造成影响);src:只要跳块就行了.
复杂度:O(m*sqrt(n))
Code
// <Bounce.cpp> - 08/19/16 17:15:29 // This file is made by YJinpeng,created by XuYike's black technology automatically. // Copyright (C) 2016 ChangJun High School, Inc. // I don't know what this program is. #include <iostream> #include <vector> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #define MOD 1000000007 #define INF 1e9 #define EPS 1e-10 using namespace std; typedef long long LL; const int MAXN=200010; const int MAXM=100010; inline int max(int &x,int &y) {return x>y?x:y;} inline int min(int &x,int &y) {return x<y?x:y;} inline int getint() { register int w=0,q=0;register char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')q=1,ch=getchar(); while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar(); return q?-w:w; } int n,m,num,type,now,ans,p,to; int a[MAXN],pos[MAXN],b[MAXN],c[MAXN]; inline int update(int x){ if(a[x]+x>min(n,pos[x]*num-1)){c[x]=1;return a[x]+x;} c[x]=c[a[x]+x]+1;return b[a[x]+x]; } int main() { freopen("Bounce.in","r",stdin); freopen("Bounce.out","w",stdout); n=getint()-1;num=(int)sqrt(n+1); for(int i=0;i<=n;i++)a[i]=getint(); for(int i=0;i<=n;i++)pos[i]=(i/num)+1; for(int i=n;i>=0;i--)b[i]=update(i); m=getint(); while(m--){ type=getint(); if(type==1){ now=getint();ans=0; while(now<=n) ans+=c[now],now=b[now]; printf("%d\n",ans); continue; } p=getint();a[p]=getint();to=(pos[p]-1)*num; for(int i=p;i>=to;i--)b[i]=update(i); } return 0; }
相关文章推荐
- 【Hnoi2010】Bzoj2002 Bounce & Codevs2333 弹飞绵羊
- 【codevs2333】&【BZOJ2002】弹飞绵羊[HNOI2010](分块)
- [BZOJ2002][Hnoi2010]Bounce 弹飞绵羊 && LCT
- BZOJ2002 HNOI2010 Bounce 弹飞绵羊 题解&代码
- BZOJ 题目2002: [Hnoi2010]Bounce 弹飞绵羊(link cut tree)
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
- BZOJ 2002([Hnoi2010]Bounce 弹飞绵羊-LCT)
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊( LCT )
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 (LCT)
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
- BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT
- 【分块】【LCT】bzoj2002 [Hnoi2010]Bounce 弹飞绵羊
- 2002: [Hnoi2010]Bounce 弹飞绵羊 - BZOJ
- bzoj2002:[Hnoi2010]Bounce 弹飞绵羊
- 【HNOI2010】【BZOJ2002】Bounce 弹飞绵羊
- BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊
- 【BZOJ】2002: [Hnoi2010]Bounce 弹飞绵羊(lct)
- 【BZOJ】2002 [Hnoi2010]Bounce 弹飞绵羊 LCT入门题
- 【bzoj2002】 [Hnoi2010]Bounce 弹飞绵羊