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 } 

 

posted @ 2016-08-22 18:07  汪立超  阅读(246)  评论(0编辑  收藏  举报