hdu 1166 树状数组 线段树
2011-08-08 09:44
316 查看
一道线段树和树状数组的基础题
用树状数组做:
用线段树做:
用树状数组做:
#include<iostream> using namespace std; #define N 50010 int size,c ; int lowbit(int x) { return x&(-x); } void modify(int i,int x) { while(i <= size) { c[i] += x; i += lowbit(i); } } int sum(int i) { int ans = 0; while(i > 0) { ans += c[i]; i -= lowbit(i); } return ans; } int main() { int t,total = 1; scanf("%d",&t); char str[10]; while(t--) { memset(c,0,sizeof(c)); //每次输入一组新的数据之前都要把数组c 置0 scanf("%d",&size); int a,b,c,i; for(i = 1;i <= size;i++) { scanf("%d",&c); modify(i,c); } printf("Case %d:\n",total++); while(scanf("%s",str)&&str[0] != 'E') { scanf("%d%d",&a,&b); switch(str[0]) { case 'Q': printf("%d\n",sum(b) - sum(a-1)); break; case 'A': modify(a,b); break; case 'S': modify(a,-b); break; } } } return 0; }
用线段树做:
#include<iostream> using namespace std; #define N 50010 struct node { int left,right; int sum; }tree[N*4]; int num ; void build(int l,int r,int i) { tree[i].left = l; tree[i].right = r; if(l == r) { tree[i].sum = num[l]; return ; } int mid = (l+r)>>1; build(l,mid,i*2); build(mid+1,r,i*2+1); tree[i].sum = tree[i*2].sum + tree[i*2+1].sum; } void modify(int l,int r,int v,int i) { if(tree[i].left == l&&tree[i].right == r) { tree[i].sum += v; return ; } int mid = (tree[i].left + tree[i].right)>>1; if(r <= mid) modify(l,r,v,i*2); else if(l > mid) modify(l,r,v,i*2+1); else { modify(l,mid,v,i*2); modify(mid+1,r,v,i*2+1); } tree[i].sum = tree[i*2].sum + tree[i*2+1].sum; } int query(int l,int r,int i) { if(l == tree[i].left&&r == tree[i].right) return tree[i].sum; int mid = (tree[i].left + tree[i].right)>>1; if(r <= mid) return query(l,r,i*2); else if(l > mid) return query(l,r,i*2+1); else return query(l,mid,i*2) + query(mid+1,r,i*2+1); } int main() { int t,total = 1; scanf("%d",&t); while(t--) { int n; char str[20]; scanf("%d",&n); int i,a,b; for(i = 1;i <= n;i++) scanf("%d",num+i); build(1,n,1); printf("Case %d:\n",total++); while(scanf("%s",str)&&str[0] != 'E') { scanf("%d%d",&a,&b); //不用加 getchar() 如果str 是字符则需要 字符串不需要 switch(str[0]) { case 'Q': printf("%d\n",query(a,b,1)); break; case 'A': modify(a,a,b,1); break; case 'S': modify(a,a,-b,1); break; } } } return 0; }
相关文章推荐
- HDU 1166 敌兵布阵 (树状数组 || 线段树)
- hdu 1166 线段树与树状数组入门 单点更新
- HDU 1166 敌兵布阵(树状数组 or 线段树 单点修改 区间求和)
- HDU 1166 敌兵布阵(树状数组、sum型线段树)
- HDU - 1166 - 敌兵布阵 (树状数组 or 线段树)
- HDU - 1166 - 敌兵布阵(树状数组、线段树)
- HDU 1166 线段树模板&树状数组模板
- HDU 1166 —— 敌兵布阵 【树状数组 or 线段树】
- HDU 1166 线段树模板&树状数组模板
- hdu 1166 敌兵布阵(树状数组 | 线段树)
- hdu 1166 敌兵布阵 单点更新 树状数组 线段树 两种做法
- hdu 1166 敌兵布阵【入门线段树 & 树状数组】
- HDU 1166 敌兵布阵 我的第一棵树,线段树,树状数组。
- hdu 1166 树状数组 线段树
- HDU1166 敌兵布阵 树状数组|线段树-构造完全二叉树(理解)
- HDU-1166 敌兵布阵 (树状数组 or 线段树)
- hdu 1166 敌兵布阵(数据结构:树状数组||线段树)
- HDU 1166 敌兵布阵 ( 树状数组,线段树)
- HDU 1166 敌兵布阵(树状数组||线段树单点更新)
- hdu 1166 树状数组 & 线段树