[Hnoi2010]Bounce 弹飞绵羊 (分块裸题)

/**
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002
题意:每个位置能够跳到下一个位置为i+s[i];
单点询问:当前点跳出n  需要跳多少步;
单点更新:将当前s[i]替换为val;

分块裸题;

*/

#include<bits/stdc++.h>
#define ll long long
using namespace std;
/**********************************************Head-----Template****************************************/
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b){ll gg=gcd(a,b);a/=gg;if(a<=LLONG_MAX/b) return a*b;return LLONG_MAX;}
/********************************Head----Temlate**********************************************/

const int maxn=2e5+7;
int n,m,s[maxn],pos[maxn];
int nxx[maxn],nxy[maxn];
//跳至下一块多少步 ; 跳至下一块的步数;

void update(int id,int val){
	s[id]=val;
	for(int i=id;i>=min(n,(pos[id]-1)*m);i--){/**************只影响当前块前的元素 tricks **************************/
		if(i+s[i]>min(n,pos[i]*m)) {
			nxx[i]=1;
			nxy[i]=i+s[i];
		}
		else {
			nxx[i]=nxx[i+s[i]]+1;
			nxy[i]=nxy[i+s[i]];
		}
	}
}

int query(int l){
	int ans=0;
	while(l<=n){
		ans+=nxx[l];
		l=nxy[l];
	}
	return ans;
}

void pre(){
	for(int i=n;i>=1;i--){
		if(i+s[i]>min(n,pos[i]*m)) {
			nxx[i]=1;
			nxy[i]=i+s[i];
		}
		else {
			nxx[i]=nxx[i+s[i]]+1;
			nxy[i]=nxy[i+s[i]];
		}
	}
}

void solved(){
	read(n);m=sqrt(n);
	for(int i=1;i<=n;i++) read(s[i]),pos[i]=(i-1)/m+1;
	pre();
	int q;read(q);
	while(q--){
		int ch,l,r;
		read(ch);
		if(ch==1) {
			read(l);
			writeln(query(l+1));
		}
		else {
			read(l),read(r);
			update(l+1,r);
		}
	}
}

int main(){
    solved();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hypHuangYanPing/article/details/81317771