hdu1166-敌兵布阵-分块

把区间分成√n份降低复杂度.

 1 #include<bits/stdc++.h>
 2 
 3 #define inf 0x3f3f3f3f
 4 
 5 const int maxn=50000;
 6 
 7 const int seg=223;
 8 
 9 using namespace std;
10 
11 int t,n,icase,x,y;
12 
13 char order[maxn/10000+10];
14 
15 int a[maxn+10];
16 
17 int sum[maxn+10];
18 
19 void Add(int x,int y){
20     a[x]+=y;
21     sum[x/seg+1]+=y;
22 }
23 
24 int query(int l,int r){
25     int res=0;
26     int L=l/seg+1,R=r/seg+1;
27     if(L==R||R==L+1){
28         for(int i=l;i<=r;i++){
29                 res+=a[i];
30         }
31     } else {
32        for(int i=l;i<=L*seg-1;i++){
33            res+=a[i];
34        }
35        for(int i=r;i>=(R-1)*seg;i--){
36            res+=a[i];
37        }
38        for(int i=L+1;i<=R-1;i++){
39            res+=sum[i];
40        }
41     }
42   return res;
43 }
44 
45 void solve(){
46     scanf("%d",&n);
47     for(int i=0;i<n;i++){
48         scanf("%d",&a[i]);
49     }
50     for(int i=0;i<n;i++){
51         sum[i/seg+1]+=a[i];
52     }
53     printf("Case %d:\n",++icase);
54     while(scanf("%s",order)!=EOF){
55         if(order[0]=='E'){
56            break;
57         } else if(order[0]=='A'){
58                 scanf("%d%d",&x,&y);
59                 x--;
60                 Add(x,y);
61         } else if(order[0]=='S'){
62                 scanf("%d%d",&x,&y);
63                 x--;
64                 Add(x,-y);
65         }
66          else if(order[0]=='Q'){
67                 scanf("%d%d",&x,&y);
68                 x--,y--;
69                 int ans=query(x,y);
70                 printf("%d\n",ans);
71         }
72     }
73 }
74 
75 void init(){
76   memset(a,0,sizeof(a));
77   memset(sum,0,sizeof(sum));
78 }
79 
80 int main()
81 {
82     scanf("%d",&t);
83     while(t--){
84         init();
85         solve();
86     }
87     return 0;
88 }

 

posted @ 2016-08-12 20:45  GeniusYang  阅读(135)  评论(0编辑  收藏  举报