hdu 1166 敌兵布阵
2012-05-27 14:32
211 查看
线段树的模版 没什么思想
#include <iostream> #include <fstream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <bitset> #include <cmath> #include <queue> #include <stack> #include <set> #include <map> #include <ctime> #define LL long long #define Vi vector<int> #define Si set<int> #define readf freopen("input.txt","r",stdin) #define writef freopen("output.txt","w",stdout) #define FU(i,a) for(int i(1); i <= (a); i++) #define FD(i,a) for(int i(a); i >= (1); i--) #define FOR(i,a,b) for(int i(a);i <= (b); i++) #define FORD(i,a,b) for(int i(a);i >= (b); i--) #define SET(a,b) memset(a,b,sizeof(a)) #define SD(a) scanf("%d",&(a)) #define LN printf("\n") #define PS printf(" ") #define pb push_back #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 using namespace std; const int maxn = 222222; int value[maxn>>2],N; struct node{ int a,b,sum; }tree[maxn];// a为线段的左端点,b为右端点,sum即为这个怎么说....和! void buildTree(int a,int b,int k){ tree[k].a=a; tree[k].b=b; if(a==b){ tree[k].sum=value[a]; return ; //别忘记return ,太纠结了 } int mid=(a+b)>>1; //装B利器 位运算! 其实就是除以2 buildTree(a,mid,k<<1); //装B利器 位运算! 其实就是乘以2 buildTree(mid+1,b,k<<1|1) ; //装B利器 位运算! 其实就是乘以2+1; tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum; //先建树后统计,所以写在后面 }// k为根结点,a为左端点,b为右端点 void update(int a,int val,int k){ if(tree[k].a==tree[k].b){ tree[k].sum+=val; return ; }//只有到了跟结点才会更新此点的值 if(a <= tree[k<<1].b ) update(a,val,k<<1); else update(a,val,k<<1|1); tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;//不要忘记将所有父节点什么的更新 }//应该每次都从根节点开始找吧..~~ int query(int x,int y,int k){ if(x <= tree[k].a && tree[k].b <=y) return tree[k].sum; //如果区间将此段包含在内,直接返回 else{ int t=0; if( x <= tree[k<<1].b ) //如果 x 在 k区间段内,y在大于k的区间段内 t+=query(x,y,k<<1); if( y >= tree[k<<1|1].a) //同理 t+=query(x,y,k<<1|1); return t; } } int main() { int T; SD(T); FOR(cas,1,T){ memset(tree,0,sizeof(tree)); scanf("%d",&N); FOR(i,1,N) SD(value[i]); buildTree(1,N,1); printf("Case %d:\n",cas); char op[9]; int i,j; while(~scanf("%s",op) && op[0]!='E'){ SD(i);SD(j); if(op[0]=='A') update(i,j,1); else if(op[0]=='S') update(i,-j,1); else printf("%d\n",query(i,j,1)); } } return 0; }
相关文章推荐
- Hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵(线段树)
- hdu 1166 敌兵布阵
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- 线段树系列-hdu-1166-敌兵布阵-单点修改区间求和
- hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵 单点更新模板
- hdu 1166 敌兵布阵
- hdu 1166 敌兵布阵
- HDU1166-线段树模版-敌兵布阵
- HDU 1166 敌兵布阵
- hdu 1166 敌兵布阵 单点更新+区间查询 segment tree or BIT
- HDU 1166 敌兵布阵 线段树,单点更新
- HDU 1166 敌兵布阵
- HDU-1166 敌兵布阵 (裸线段树算法)
- hdu 1166 敌兵布阵(线段树入门题)
- hdu 1166敌兵布阵(树状数组or线段树)
- HDU 1166 敌兵布阵 (线段树 & 树状数组)
- [HDU 1166] 敌兵布阵
- HDU 1166 敌兵布阵(树状数组)