弹飞绵羊
一道足够良心(也就是足够简单)的题目。理论上应该使用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;
}
一如既往,万事胜意

浙公网安备 33010602011771号