HDU 1166 敌兵布阵

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

用结构体做的  470+ms;

  1 #include <cstdio>
  2 #include <algorithm>
  3 #include <iostream>
  4 #include <cstdlib>
  5 #include <queue>
  6 #include <cmath>
  7 #include <cstring>
  8 
  9 using namespace std;
 10 
 11 struct N
 12 {
 13     int z,y,data;
 14     struct N *l,*r;
 15 };
 16 
 17 struct N *creat()
 18 {
 19     struct N *p = (struct N *)malloc(sizeof(struct N));
 20     p->l =  NULL;
 21     p->r = NULL;
 22     return p;
 23 }
 24 
 25 int st[50010];
 26 
 27 int change(int z,int y,struct N *root)
 28 {
 29     int m = (z+y)/2;
 30     root->z = z;
 31     root->y = y;
 32     if(z == y)
 33     {
 34         root->data = st[z];
 35         return (st[z]);
 36     }
 37     root->l = creat();
 38     root->r = creat();
 39     int tl = change(z,m,root->l);
 40     int tr = change(m+1,y,root->r);
 41     root->data = (tl + tr);
 42     return root->data;
 43 }
 44 
 45 void add(int site,int s,int z,int y,struct N *root)
 46 {
 47     int m = (z+y)/2;
 48 
 49     if(z == y)
 50     {
 51         root->data += s;
 52         return;
 53     }
 54 
 55     if(site <= m)
 56     {
 57         add(site,s,z,m,root->l);
 58         root->data += s;
 59     }
 60     else
 61     {
 62         add(site,s,m+1,y,root->r);
 63         root->data += s;
 64     }
 65 }
 66 
 67 void sub(int site,int s,int z,int y,struct N *root)
 68 {
 69     int m = (z+y)/2;
 70 
 71     if(z == y)
 72     {
 73         root->data -= s;
 74         return;
 75     }
 76 
 77     if(site <= m)
 78     {
 79         sub(site,s,z,m,root->l);
 80         root->data -= s;
 81     }
 82     else
 83     {
 84         sub(site,s,m+1,y,root->r);
 85         root->data -= s;
 86     }
 87 }
 88 
 89 int query(int ml,int mr,int z,int y,struct N *root)
 90 {
 91     int m = (z+y)/2;
 92 
 93     if(ml == z && mr == y)
 94         return root->data;
 95 
 96     if(mr <= m)
 97     {
 98         return query(ml,mr,z,m,root->l);
 99     }
100     else if(m+1 <= ml)
101     {
102         return query(ml,mr,m+1,y,root->r);
103     }
104     else
105     {
106         return ( query(ml,m,z,m,root->l) + query(m+1,mr,m+1,y,root->r) );
107     }
108 }
109 
110 int main()
111 {
112     int T;
113     int icase = 0;
114     int n,i;
115     char order[20];
116     scanf("%d",&T);
117     while(T--)
118     {
119         scanf("%d",&n);
120         for(i = 1;i <= n; i++)
121         {
122             scanf("%d",&st[i]);
123         }
124         struct N *root = creat();
125 
126         root->z = 1;
127         root->y = n;
128 
129         change(1,n,root);
130 
131         printf("Case %d:\n",++icase);
132 
133         while(scanf("%s",order) != EOF)
134         {
135             if(order[0] == 'E')
136                 break;
137             else if(order[0] == 'A')
138             {
139                 int site,s;
140                 scanf("%d %d",&site,&s);
141                 add(site,s,1,n,root);
142             }
143             else if(order[0] == 'S')
144             {
145                 int site,s;
146                 scanf("%d %d",&site,&s);
147                 sub(site,s,1,n,root);
148             }
149             else if(order[0] == 'Q')
150             {
151                 int l,r;
152                 scanf("%d %d",&l,&r);
153                 int sum = query(l,r,1,n,root);
154                 printf("%d\n",sum);
155             }
156         }
157 
158     }
159     return 0;
160 }
  1 #include <cstdio>//用数组模拟的线段树  跑了370+  玛德  说好的0ms呢
  2 #include <algorithm>//在大白书 点修改  上看的  就是在不停的传递 树的节点编号node  
  3 #include <iostream>//当前节点的左子节点编号为2*node  右子节点为2*node+1;
  4 #include <cstdlib>
  5 #include <queue>
  6 #include <cmath>
  7 #include <cstring>
  8 
  9 using namespace std;
 10 
 11 int st[100010];
 12 int a[50001];
 13 
 14 int change(int node,int l,int r)
 15 {
 16     int m = (l+r)/2;
 17     if(l == r)
 18     {
 19         st[node] = a[l];
 20         return st[node];
 21     }
 22     st[node] = change(node+node,l,m) + change(node+node+1,m+1,r);
 23     return st[node];
 24 }
 25 
 26 void add(int site,int s,int node,int l,int r)
 27 {
 28     int m = (l+r)/2;
 29 
 30     if(l == r && r == site)
 31     {
 32         st[node] += s;
 33         return ;
 34     }
 35     if(site <= m)
 36     {
 37         add(site,s,node+node,l,m);
 38         st[node] += s;
 39         return ;
 40     }
 41     if(m < site)
 42     {
 43         add(site,s,node+node+1,m+1,r);
 44         st[node] += s;
 45         return ;
 46     }
 47 }
 48 
 49 void sub(int site,int s,int node,int l,int r)
 50 {
 51     int m = (l+r)/2;
 52 
 53     if(l == r && r == site)
 54     {
 55         st[node] -= s;
 56         return ;
 57     }
 58     if(site <= m)
 59     {
 60         sub(site,s,node+node,l,m);
 61         st[node] -= s;
 62         return ;
 63     }
 64     if(m < site)
 65     {
 66         sub(site,s,node+node+1,m+1,r);
 67         st[node] -= s;
 68         return ;
 69     }
 70 }
 71 
 72 int query(int ml,int mr,int node,int l,int r)
 73 {
 74     if(ml == l && mr == r)
 75     {
 76         return st[node];
 77     }
 78     int m = (l+r)/2;
 79 
 80     if(mr <= m)
 81     {
 82         return query(ml,mr,node+node,l,m);
 83     }
 84     if(m < ml)
 85     {
 86         return query(ml,mr,node+node+1,m+1,r);
 87     }
 88     return (query(ml,m,node+node,l,m) + query(m+1,mr,node+node+1,m+1,r));
 89 }
 90 
 91 int main()
 92 {
 93     int T,icase = 0;
 94     int n,i;
 95     char order[6];
 96 
 97     scanf("%d",&T);
 98     
 99 
100     while(T--)
101     {
102         scanf("%d",&n);
103         for(i = 1;i <= n; i++)
104             scanf("%d",&a[i]);
105         change(1,1,n);
106         printf("Case %d:\n",++icase);
107         while(scanf("%s",order) != EOF)
108         {
109             if(order[0] == 'A')
110             {
111                 int site,s;
112                 scanf("%d %d",&site,&s);
113                 add(site,s,1,1,n);
114             }
115             else if(order[0] == 'S')
116             {
117                 int site,s;
118                 scanf("%d %d",&site,&s);
119                 sub(site,s,1,1,n);
120             }
121             else if(order[0] == 'Q')
122             {
123                 int l,r;
124                 scanf("%d %d",&l,&r);
125                 printf("%d\n",query(l,r,1,1,n));
126             }
127             else if(order[0] == 'E')
128                 break;
129         }
130 
131     }
132     return 0;
133 }
原文地址:https://www.cnblogs.com/zmx354/p/3106208.html