HDOJ 1166 敌兵布阵
来源:互联网 发布:java杨辉三角形代码 编辑:程序博客网 时间:2024/06/05 23:39
今天刚刚学了线段树,原来还有点不理解,毕竟数据结构中的树并没有经常涉及数组,虽然有讲,但已经忘得差不多了。这是我第一个线段树的题目,也是蒋雄学长讲课之后才接触,去了zzy学长的博客,感觉懂了它用数组构造树,和查询的整个过程
所以对我来说,这道题很好入门的题。
#include<iostream>using namespace std;#define MAXN 50005int cnt[MAXN*4];void Build(int l,int r,int pt)//pt是数组cnt的下标,从根节点开始 { if( l==r){ scanf("%d",&cnt[pt]); return ; } int mid=(l+r)>>1; Build(l,mid,pt<<1); // pt<<1 = 2*pt; Build(mid+1,r,pt<<1|1); //pt<<1|1 = 2*pt+1 ; cnt[pt]=cnt[pt<<1]+cnt[pt<<1|1];}void Update(int i,int add,int l,int r,int pt){ if( l==r){ cnt[pt]+=add; return ; } int mid=(l+r)>>1; if(i<=mid) Update(i,add,l,mid,pt<<1); else Update(i,add,mid+1,r,pt<<1|1); cnt[pt]=cnt[pt<<1]+cnt[pt<<1|1];}int Query(int L,int R,int l,int r,int pt){ if( L<=l&&R>=r) return cnt[pt]; int sum=0; int mid=(l+r)>>1; if(L<=mid) sum+=Query(L,R,l,mid,pt<<1); if(R>mid) sum+=Query(L,R,mid+1,r,pt<<1|1); return sum;}int main() { int i,t,n,c,l,r; char cmd[10]; scanf("%d",&t); for( c=1; c<=t; c++){ memset(cnt,0,sizeof(cnt)); scanf("%d",&n); Build(1,n,1); printf("Case %d:\n",c); while( true){ scanf("%s",cmd); if( cmd[0]=='E') break; if( cmd[0]=='Q'){ scanf("%d%d",&l,&r); printf("%d\n",Query(l,r,1,n,1)); } else if( cmd[0]=='A'){ scanf("%d%d",&i,&l); Update(i,l,1,n,1); } else{ scanf("%d%d",&i,&l); Update(i,-l,1,n,1); } } } return 0;}
- HDOJ 1166 敌兵布阵
- HDOJ 1166 敌兵布阵
- HDOJ 1166 - 敌兵布阵
- hdoj 1166 敌兵布阵
- hdoj 1166 敌兵布阵
- HDOJ 1166 敌兵布阵
- HDOJ 1166 ---敌兵布阵
- HDOJ 1166 敌兵布阵
- HDOJ 1166 敌兵布阵
- HDOJ 1166 敌兵布阵
- hdoj 1166 敌兵布阵
- hdoj 1166 敌兵布阵
- HDOJ-1166 敌兵布阵
- hdoj 1166 敌兵布阵
- hdoj 1166 敌兵布阵
- HDOJ 1166-敌兵布阵
- HDU/HDOJ----1166 敌兵布阵
- hdu/hdoj 1166 敌兵布阵
- C#泛型集合—Dictionary<K,V>使用技巧
- gdb命令
- Hash表实现 C++
- CSS优先级或特殊性 总结归纳
- CPU cache学习
- HDOJ 1166 敌兵布阵
- 删除文件/文件夹时,报错说"找不到该项目,请确认该项目的位置"
- 3D引擎
- C#泛型集合—List<T>使用技巧
- cache
- 双链表相关资料
- Programming 3D games on Android with Irrlicht and Bullet
- Windows运行命令集锦
- fedaro启用LVM情况下新建并挂载swap分区