bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊

 1 #include<cstdio>
 2 #include<cmath>
 3 int a[200006],n,m,b[200006],c[200006],dian[200006],l[200006],r[200006];
 4 int main()
 5 {
 6     scanf("%d",&n);
 7     for(int i=1;i<=n;i++)
 8       scanf("%d",&a[i]);
 9     int len,len1;
10     len1=floor(sqrt(n));
11     len=n/len1;
12     if(len1*len1!=n)
13       len++;
14     for(int i=1;i<=len;i++)
15       {
16         l[i]=(i-1)*len1+1;
17         r[i]=i*len1;
18       }
19     r[len]=n;
20     for(int i=1;i<=n;i++)
21       dian[i]=(i-1)/len1+1;
22     for(int i=len;i>0;i--)
23       for(int j=r[i];j>=l[i];j--)
24         {
25               if(j+a[j]>r[i])
26               {
27                 b[j]=j+a[j];
28                 c[j]=1;
29               }
30               else
31               {
32                 b[j]=b[j+a[j]];
33                 c[j]=c[j+a[j]]+1;
34               }
35         }
36     scanf("%d",&m);
37     for(int i=0;i<m;i++)
38       {
39         int a1,a2,a3;
40         scanf("%d%d",&a1,&a2);
41         a2++;
42         if(a1==1)
43           {
44             int sum=0;
45             for(int j=a2;j<=n;j=b[j])
46               sum+=c[j];
47             printf("%d
",sum);
48             }
49         else
50           {
51             scanf("%d",&a3);
52             a[a2]=a3;
53             for(int j=a2;j>=l[dian[a2]];j--)
54             {
55               if(j+a[j]>r[dian[a2]])
56               {
57                 b[j]=j+a[j];
58                 c[j]=1;
59               }
60                   else
61               {
62                 b[j]=b[j+a[j]];
63                 c[j]=c[j+a[j]]+1;
64               }
65           }
66     }
67       }
68     return 0;
69 }

暴力分块

原文地址:https://www.cnblogs.com/xydddd/p/5290644.html