首页 > 代码库 > HDU1166 线段树(最基础题)

HDU1166 线段树(最基础题)

 

 

1、写法一:

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 

 5 using namespace std;
 6 
 7 int numv[50005<<2];
 8 int A[50005];
 9 
10 void builtTree(int o,int l,int r){
11     if(l==r) {
12         numv[o]=A[l];
13         return ;
14     }
15     int m=l+(r-l)/2;
16     builtTree(2*o,l,m);
17     builtTree(2*o+1,m+1,r);
18     numv[o]=numv[2*o]+numv[2*o+1];
19     return ;
20 }
21 void Update(int o,int l,int r,int p,int x){
22     if (l==r){
23         numv[o]+=x;
24         return ;
25     }
26     int m=l+(r-l)/2;
27     if (p<=m) Update(2*o,l,m,p,x);
28     else Update(2*o+1,m+1,r,p,x);
29     numv[o]=numv[2*o]+numv[2*o+1];
30 }
31 int Query(int ql,int qr,int o,int l,int r){
32     if (ql<=l && r<=qr) return numv[o];
33     int m=l+(r-l)/2;
34     int ans=0;
35     if (ql<=m) ans+=Query(ql,qr,2*o,l,m);
36     if (m+1<=qr) ans+=Query(ql,qr,2*o+1,m+1,r);
37     return ans;
38 }
39 int t,n;
40 int main(){
41     scanf("%d",&t);
42     for(int cas=1;cas<=t;cas++){
43         scanf("%d",&n);
44         printf("Case %d:\n",cas);
45         for(int i=1;i<=n;i++) scanf("%d",&A[i]);
46         builtTree(1,1,n);
47         char s[105];
48         while(~scanf("%s",s)){
49             if (s[0]==E) {
50                 break;
51             }
52             int a,b;
53             scanf("%d%d",&a,&b);
54             if (s[0]==Q){
55                 int ans=Query(a,b,1,1,n);
56                 printf("%d\n",ans);
57             }
58             if (s[0]==A){
59                 Update(1,1,n,a,b);
60             }
61             if (s[0]==S){
62                 Update(1,1,n,a,-b);
63             }
64         }
65     }
66     return 0;
67 }
View Code

 

2、写法二:

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 
 5 using namespace std;
 6 
 7 int numv[50005<<2];
 8 int A[50005];
 9 int t,n;
10 void builtTree(int o,int l,int r){
11     if(l==r) {
12         numv[o]=A[l];
13 //        cout<<"("<<l<<","<<r<<"):"<<numv[o]<<endl;
14         return ;
15     }
16     int m=l+(r-l)/2;
17     builtTree(2*o,l,m);
18     builtTree(2*o+1,m+1,r);
19     numv[o]=numv[2*o]+numv[2*o+1];
20 //    cout<<"("<<l<<","<<r<<"):"<<numv[o]<<endl;
21     return ;
22 }
23 int findo(int a){
24     int o=1,l=1,r=n;
25     while(l<r){
26         int m=(l+r)/2;
27         if (a<=m) {
28             o=2*o,r=m;
29         }
30         if (a>=m+1){
31             o=2*o+1,l=m+1;
32         }
33     }
34     return o;
35 }
36 void Update(int o,int b){
37     while(o>0){
38         numv[o]=numv[o]+b;
39         o=o/2;
40     }
41     return ;
42 }
43 int Query(int ql,int qr,int o,int l,int r){
44     if (ql<=l && r<=qr) return numv[o];
45     int m=l+(r-l)/2;
46     int ans=0;
47     if (ql<=m) ans+=Query(ql,qr,2*o,l,m);
48     if (m+1<=qr) ans+=Query(ql,qr,2*o+1,m+1,r);
49     return ans;
50 }
51 
52 int main(){
53     scanf("%d",&t);
54     for(int cas=1;cas<=t;cas++){
55         scanf("%d",&n);
56         printf("Case %d:\n",cas);
57         for(int i=1;i<=n;i++) scanf("%d",&A[i]);
58         builtTree(1,1,n);
59         char s[105];
60         while(~scanf("%s",s)){
61             if (s[0]==E) {
62                     break;
63             }
64             char Qr[15];int a,b;
65             scanf("%d%d",&a,&b);
66             if (s[0]==Q){
67 //                cout<<"<<"<<endl;
68                 int ans=Query(a,b,1,1,n);
69                 printf("%d\n",ans);
70             }
71             if (s[0]==A){
72                 Update(findo(a),b);
73             }
74             if (s[0]==S){
75                 Update(findo(a),-b);
76             }
77         }
78     }
79     return 0;
80 }
View Code

 

自己体会!!!数据结构真的是很灵活很有趣的