设为首页 加入收藏

TOP

hdu 1166线段树
2015-07-20 18:05:37 来源: 作者: 【 】 浏览:3
Tags:hdu 1166 线段
线段树的一般模板,1.结构体数组tree来存储  2.线段树的构建函数buildTree  3.改变元素值函数update   4.查询区间内总和的函数query
全部使用递归来实现

 
#####################################################################
#include
  
   
#include
   
     #include
    
      #include
     
       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; }
     
    
   
  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++primer读书笔记8重载操作符 下一篇POJ3264Balanced Lineup(最基础..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: