首页 > 代码库 > hdu1166敌兵布阵

hdu1166敌兵布阵

 1 //Accepted 250MS 2480K
 2 #include <cstdio>
 3 #include <cstring>
 4 const int MAXN = 50005;
 5 struct node
 6 {
 7     int l,r;
 8     int add,sum;
 9 }f[3*MAXN];
10 int n;
11 int a[MAXN];
12 void build(int t,int l,int r)
13 {
14     f[t].l=l;
15     f[t].r=r;
16     f[t].add=0;
17     if (l==r)
18     {
19         f[t].sum=a[l];
20         return ;
21     }
22     int mid=(l+r)/2;
23     build(2*t,l,mid);
24     build(2*t+1,mid+1,r);
25     f[t].sum=f[2*t].sum+f[2*t+1].sum;
26 }
27 void add(int t,int l,int r,int c)
28 {
29     if (f[t].l==l && f[t].r==r)
30     {
31         f[t].add+=c;
32         return ;
33     }
34     f[t].sum+=(r-l+1)*c;
35     int mid=(f[t].l+f[t].r)/2;
36     if (r<=mid) add(2*t,l,r,c);
37     else
38     {
39         if (l>mid) add(2*t+1,l,r,c);
40         else
41         {
42             add(2*t,l,mid,c);
43             add(2*t+1,mid+1,r,c);
44         }
45     }
46 }
47 int query(int t,int l,int r)
48 {
49     if (f[t].l==l && f[t].r==r)
50     {
51         return f[t].sum+f[t].add*(f[t].r-f[t].l+1);
52     }
53     int mid=(f[t].l+f[t].r)/2;
54     f[2*t].add+=f[t].add;
55     f[2*t+1].add+=f[t].add;
56     f[t].sum+=f[t].add*(f[t].r-f[t].l+1);
57     f[t].add=0;
58     if (r<=mid) return query(2*t,l,r);
59     else
60     {
61         if (l>mid) return query(2*t+1,l,r);
62         else
63         {
64             return query(2*t,l,mid)+query(2*t+1,mid+1,r);
65         }
66     }
67 }
68 int main()
69 {
70     char s[10];
71     int T;
72     scanf("%d",&T);
73     for (int t=1;t<=T;t++)
74     {
75         scanf("%d",&n);
76         for (int i=1;i<=n;i++)
77         scanf("%d",&a[i]);
78         printf("Case %d:\n",t);
79         build(1,1,n);
80         while (scanf("%s",s) && s[0]!=E)
81         {
82             int x,y;
83             scanf("%d%d",&x,&y);
84             if (s[0]==Q)
85             {
86                 printf("%d\n",query(1,x,y));
87             }
88             else if (s[0]==A)
89             {
90                 add(1,x,x,y);
91             }
92             else if (s[0]==S)
93             {
94                 add(1,x,x,-y);
95             }
96         }
97     }
98     return 0;
99 }
View Code