首页 > 代码库 > 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 }
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 }
自己体会!!!数据结构真的是很灵活很有趣的
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。