bzoj2002弹(dan)飞绵羊 分块水过
据说是道lct求深度的题
但是在小猫大的指点下用分块就n^1.5水过了
= =数据忘记加强系列
代码极其不美观,原因是一开始是听小猫大讲的题意,还以为是弹到最前面。。。
1 #include <cstdio> 2 #include <cmath> 3 using namespace std; 4 int n,m,p,q,k; 5 int a[200001],b[200001],c[200001]; 6 int main() 7 { 8 scanf("%d",&n); 9 for(int i=1;i<=n;i++) 10 scanf("%d",&a[n-i+1]); 11 int N=(int)sqrt(n); 12 for(int i=1,j=0;i<=n;i++,j=(i-1)/N) 13 { 14 b[i]=i-a[i];c[i]=1; 15 if(b[i]>j*N) 16 c[i]+=c[b[i]],b[i]=b[b[i]]; 17 } 18 scanf("%d",&m); 19 for(int i=1;i<=m;i++) 20 { 21 scanf("%d%d",&p,&q); 22 q=n-q; 23 if(p==2) 24 { 25 scanf("%d",&k); 26 a[q]=k; 27 for(int j=(q-1)/N;q<=(j+1)*N;q++) 28 { 29 b[q]=q-a[q];c[q]=1; 30 if(b[q]>j*N) 31 c[q]+=c[b[q]],b[q]=b[b[q]]; 32 } 33 } 34 else 35 { 36 int ans=0; 37 while(q && a[q]) 38 ans+=c[q],q=b[q]; 39 printf("%d\n",ans); 40 } 41 } 42 return 0; 43 }