分块没过样例
查看原帖
分块没过样例
912248
FuckYouJinhai楼主2023/4/23 21:44
#include<cstdio>
#include<cmath>
int step[200020],to[200020],bel[200020],val[200020],st[512],ed[512];
int n,m,bl;
void upd(int l,int r){
	for(int i=r;i>=l;--i){
		if(i+val[i]>ed[bel[i]]){
			to[i]=i+val[i];
			step[i]=1;
		}else{
			to[i]=to[i+val[i]];
			step[i]=step[i+val[i]]+1;
		}
	}
}
void init(){
	for(int i=1;i<=bl;++i){
		st[i]=n/bl*(i-1)+1;
		ed[i]=n/bl*i;
	}
	ed[bl]=n;
	for(int i=1;i<=bl;++i)
		for(int j=st[i];j<=ed[i];++j)
			bel[j]=i;
	upd(1,n);
}
int ask(int x){
	int res=0;
	while(x<=n){
		res+=step[x];
		x=to[x];
	}
	return res;
}
int main(){
	scanf("%d",&n);
	bl=sqrt(n);
	for(int i=1;i<=n;++i)
		scanf("%d",&val[i]);
	init();
	scanf("%d",&m);
	while(m--){
		int o,x,y;
		scanf("%d",&o);
		if(o==1){
			scanf("%d",&x);
			printf("%d\n",ask(x));
		}else{
			scanf("%d%d",&x,&y);
			val[x]=y;
			upd(st[bel[x]],ed[bel[x]]);
		}
	}
	return 0;
}

3 5 6 T 了,目测被卡常数

其他的 WA

2023/4/23 21:44
加载中...