标签:max sub tree 裸题 查询 tom 节点 ase style
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 #define Max 50005 6 7 int n; 8 int Tree[Max<<2]; 9 10 void build(int k,int l,int r)//建线段树,k表示子节点坐标 11 { 12 if(l == r) scanf("%d",&Tree[k]); 13 else 14 { 15 int mid = (l+r)/2; 16 build(k*2,l,mid); 17 build(k*2+1,mid+1,r); 18 Tree[k] = Tree[k*2] + Tree[k*2+1];//求和 19 } 20 } 21 int query(int a,int b,int k,int l,int r)//a,b是当前查询区间,k是当前的根节点,l,r是要求查询区间 22 { 23 if(a >= l && b <= r) return Tree[k]; 24 else 25 { 26 int ans = 0; 27 int mid = (a+b)/2; 28 if(l <= mid) ans += query(a,mid,k*2,l,r); 29 if(r > mid) ans += query(mid+1,b,k*2+1,l,r); 30 return ans; 31 } 32 } 33 void update(int l,int r,int k,int pos,int v)//l,r是查询区间,k是当前根节点,pos是查询位置 34 { 35 if(l == r) Tree[k] += v; 36 else{ 37 int mid = (l+r)/2; 38 if(pos <= mid) update(l,mid,k*2,pos,v); 39 if(pos > mid) update(mid+1,r,k*2+1,pos,v); 40 Tree[k] = Tree[2*k] + Tree[2*k+1]; 41 } 42 } 43 44 int main() 45 { 46 int T,l,r,pos,val; 47 char order[10]; 48 scanf("%d",&T); 49 for(int t=1;t<=T;t++) 50 { 51 52 scanf("%d",&n); 53 build(1,1,n); 54 printf("Case %d:\n",t); 55 while(cin>>order) 56 { 57 if(order[0]==‘E‘) 58 break; 59 if(order[0]==‘Q‘)//查询区间和 60 { 61 //int l,r; 62 scanf("%d%d",&l,&r); 63 printf("%d\n",query(1,n,1,l,r)); 64 } 65 else if(order[0]==‘A‘)//点更新 66 { 67 //int pos,val; 68 scanf("%d%d",&pos,&val); 69 update(1,n,1,pos,val); 70 } 71 else if(order[0]==‘S‘)//点更新 72 { 73 //int pos,val; 74 scanf("%d%d",&pos,&val); 75 update(1,n,1,pos,-val); 76 } 77 } 78 } 79 return 0; 80 }
标签:max sub tree 裸题 查询 tom 节点 ase style
原文地址:http://www.cnblogs.com/Annetree/p/7218090.html