標籤:線段樹 遞迴
線段樹的一般模板,1.結構體數組tree來儲存 2.線段樹的構建函數buildTree 3.改變元素值函數update 4.查詢區間內總和的函數query
全部使用遞迴來實現
#####################################################################
#include<iostream>#include<stdio.h>#include<string>#include<string.h>using namespace std;const int maxn = 50050;int ans;struct node{int left, right, sum;int mid(){return (left+right)/2;}}tree[maxn*4];void buildTree(int left, int right, int rt){tree[rt].left = left;tree[rt].right = right;if(left == right){cin >> tree[rt].sum;return ;}int mid = tree[rt].mid();buildTree(left, mid, rt*2);buildTree(mid+1, right, rt*2+1);tree[rt].sum = tree[rt*2].sum + tree[rt*2+1].sum;}void query(int left, int right, int rt, int L, int R){if(L <= left && R >= right){ans += tree[rt].sum;return ;}int mid = tree[rt].mid();if(R <= mid)query(left, mid, rt*2, L, R);else if(L > mid)query(mid+1, right, rt*2+1, L, R);else{query(left, mid, rt*2, L, R);query(mid+1, right, rt*2+1, L, R);}}void update(int left, int right, int rt, int pos, int add){if(left == right){tree[rt].sum += add;return ;}int mid = tree[rt].mid();if(pos <= mid)update(left, mid, rt*2, pos, add);else update(mid+1, right, rt*2+1, pos, add);tree[rt].sum = tree[rt*2].sum + tree[rt*2+1].sum;}int main(){int T, N, temp;int a, b, Case = 0;string str;scanf("%d",&T);while(T --){cin >> N;buildTree(1, N, 1);Case ++;printf("Case %d:\n",Case);while( cin >> str ){if(str == "End") break;scanf("%d%d", &a, &b);if(str == "Add"){update(1, N, 1, a, b);}else if(str == "Sub"){update(1, N, 1, a, -b);}else {ans = 0;query(1, N, 1, a, b);printf("%d\n",ans); }}}return 0;}
hdu 1166線段樹