hdu 1166 敌兵布阵
2011-08-07 19:23
288 查看
这个题目很快敲出来,但是还是出现一点问题。就是在写Query函数的时候,我定义函数的类型为int类型。直接返回结果就不对了。后来想想了想,因为线段树回溯的时候,会有合并操作。我那样返回值,值返回的是某个区间上的值,不是真正我想要的结果。这一点也提醒我写段树的所有函数的时候,最好都写成无返回值类型。如果真想得到某个值,可以定义全局变量,在函数中累加就行了。有了递归,很多情况就打不一样了!
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define N 60000 struct SegTree { int l,r,mid; int sum; }tree[N*3]; int s ,sum; void BuildTree(int root,int l,int r) { tree[root].l=l; tree[root].r=r; tree[root].mid=(l+r)/2; if(l==r) { tree[root].sum=s[l]; return; } BuildTree(2*root,l,tree[root].mid); BuildTree(2*root+1,tree[root].mid+1,r); tree[root].sum=tree[2*root].sum+tree[2*root+1].sum; } void Query(int root,int l,int r) { if(tree[root].l==l&&tree[root].r==r) { sum+=tree[root].sum; return ; } if(l>tree[root].mid) { Query(2*root+1,l,r); } else if(r<=tree[root].mid) { Query(2*root,l,r); } else { Query(2*root,l,tree[root].mid); Query(2*root+1,tree[root].mid+1,r); } } void Updata(int root,int a,int b) { tree[root].sum+=b; if(tree[root].l==tree[root].r)return; if(a<=tree[root].mid)Updata(2*root,a,b); else Updata(2*root+1,a,b); } int main() { int t; int cn=0; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&s[i]); } BuildTree(1,1,n); char ch[30]; printf("Case %d:\n",++cn); while(scanf("%s",ch)!=EOF) { int a,b; if(strcmp(ch,"End")==0)break; scanf("%d%d",&a,&b); if(strcmp(ch,"Query")==0) { sum=0; Query(1,a,b); printf("%d\n",sum); } else if(strcmp(ch,"Add")==0) { Updata(1,a,b); } else { Updata(1,a,-b); } } } return 0; }
相关文章推荐
- hdu 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- hdu(1166))敌兵布阵
- hdu 1166 敌兵布阵 单点更新 树状数组 线段树 两种做法
- hdu 1166 敌兵布阵 线段树(单点更新)
- HDU 1166 敌兵布阵 线段树 部分和 点更新
- HDU 1166 敌兵布阵 线段树入门题目
- hdu 1166 敌兵布阵_线段树
- hdu 1166 敌兵布阵(线段树 or 树状数组)
- hdu 1166 敌兵布阵 (线段树单点更新)
- HDU 1166 敌兵布阵 线段树/树状数组入门题
- hdu-1166-敌兵布阵(线段树-单点修改模版)
- HDU 1166 敌兵布阵
- hdu-1166-敌兵布阵
- 线段树之HDU 1166 敌兵布阵
- HDU 1166 敌兵布阵
- hdu 1166 敌兵布阵(线段树单点更新)
- hdu-1166-敌兵布阵
- hdu 1166 敌兵布阵 (线段树 单点更新 区间求和)
- HDU 1166 敌兵布阵(线段树:单点add,区间求和)