弹飞绵羊

link

一道足够良心(也就是足够简单)的题目。理论上应该使用lct来硬刚(就当复习了),但由于分块的做法实在是太过于简单了,想想算了吧。

#include<cstdio>
#include<cmath>
#define zczc
#define read(A) scanf("%d",&A)
const int N=200010,S=510;

int m,n,num,size,a[N],f[N],p[N],bl[N],pl[S],pr[S];
inline void work(int i){
	if(i-a[i]<=0)f[i]=1,p[i]=0;
	if(bl[i-a[i]]^bl[i])f[i]=1,p[i]=i-a[i];
	else f[i]=f[i-a[i]]+1,p[i]=p[i-a[i]];
}

signed main(){
	
	#ifdef zczc
	freopen("in.txt","r",stdin);
	#endif
	
	read(m);size=ceil(sqrt(m));num=m/size;if(m%size)num++;
	for(int i=1;i<=num;i++)pl[i]=(i-1)*size+1,pr[i]=i*size;pr[num]=m;
	for(int i=m;i;i--)read(a[i]);
	for(int i=1;i<=m;i++)bl[i]=(i-1)/size+1,work(i);
	int op,s1,an;read(n);
	while(n--){
		read(op);read(s1);s1=m-s1;
		if(op==1){an=0;while(s1)an+=f[s1],s1=p[s1];printf("%d\n",an);}
		else{read(a[s1]);for(int i=s1;i<=pr[bl[s1]];i++)work(i);}
	}
	
	return 0;
}
posted @ 2022-02-13 19:17  Feyn618  阅读(52)  评论(0)    收藏  举报