Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 70626 Accepted Submission(s): 29579
1 #include <cstdio> 2 3 struct Node{ 4 int l,r; //结点的左右边界 5 int value; //区间和 6 int add; //更新操作的增量 7 }; 8 Node node[50005<<2]; //线段树需要的空间至少为数组大小的四倍,确切地说为大于数组长度的2的n次幂 9 int num[50005]; 10 int t,n,cn = 0; 11 char order[10]; 12 13 void pushUp(int v) //更新value 14 { 15 node[v].value = node[v<<1].value+node[v<<1|1].value; 16 } 17 18 void pushDown(int v) 19 { 20 if(node[v].add){ //传递增量 21 node[v<<1].add += node[v].add; //儿子本身可能也有增量 22 node[v<<1|1].add += node[v].add; 23 node[v].add = 0; //增量已传递 24 } 25 } 26 27 void build(int v, int l, int r) 28 { 29 node[v].l = l; 30 node[v].r = r; 31 if(l == r){ 32 node[v].value = num[l]; 33 node[v].add = 0; //初始化为0 34 return; 35 } 36 int mid = (l+r)>>1; 37 build(v<<1, l, mid); //建左子树 38 build(v<<1|1, mid+1, r); //建右子树 39 pushUp(v); 40 } 41 42 void update(int v, int l, int r, int m) 43 { 44 if(node[v].l == l && node[v].r == r){ 45 node[v].value += m*(r-l+1); //更新 46 node[v].add = m; //记录增量 47 return; //儿子实际未更新,省时 48 } 49 pushDown(v); //传递增量 50 int mid = (node[v].l+node[v].r)>>1; 51 if(r <= mid) //只更新左子树 52 update(v<<1, l, r, m); 53 else if(l>mid) //只更新右子树 54 update(v<<1|1, l, r, m); 55 else{ //横跨左右子树,均更新 56 update(v<<1, l, mid, m); 57 update(v<<1|1, mid+1, r, m); 58 } 59 pushUp(v); 60 } 61 62 int query(int v, int l, int r) 63 { 64 if(node[v].l == l && node[v].r == r) 65 return node[v].value; 66 pushDown(v); 67 int mid = (node[v].l+node[v].r)>>1; 68 int ans = 0; 69 if(r <= mid) 70 ans = query(v<<1, l, r); 71 else if(l>mid) 72 ans = query(v<<1|1, l, r); 73 else 74 ans = query(v<<1, l, mid)+query(v<<1|1, mid+1, r); 75 return ans; 76 } 77 78 int main() 79 { 80 scanf("%d",&t); 81 while(t--){ 82 scanf("%d",&n); 83 for(int i = 1; i <= n; ++i) 84 scanf("%d",&num[i]); 85 printf("Case %d:\n",++cn); 86 build(1, 1, n); 87 int i,j; 88 while(scanf("%s",order), order[0] != ‘E‘){ 89 if(order[0] == ‘Q‘){ 90 scanf("%d%d",&i,&j); 91 printf("%d\n",query(1, i ,j)); 92 } 93 else if(order[0] == ‘A‘){ 94 scanf("%d%d",&i,&j); 95 update(1, i, i, j); 96 } 97 else if(order[0] == ‘S‘){ 98 scanf("%d%d",&i,&j); 99 update(1, i, i, -j); 100 } 101 } 102 } 103 return 0; 104 }
原文:http://www.cnblogs.com/inmoonlight/p/5445793.html