hdu 1166 敌兵布阵 (线段树)
2012-05-09 08:35
447 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1166
最基础的线段树,单点更新。完全跟着HH的代码风格写的。
code:
#include<cstdio>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn = 50005 ;
int sum[maxn<<2] ;
void PushUp(int rt){
sum[rt] = sum[rt<<1] + sum[rt<<1|1] ;
}
void build(int l, int r, int rt){
if(l==r){
scanf("%d", &sum[rt]) ;
return ;
}
int m = (l + r) >> 1 ;
build(lson) ;
build(rson) ;
PushUp(rt) ;
}
void update(int p, int add, int l, int r, int rt){
if(l==r){
sum[rt] += add ;
return ;
}
int m = (l + r) >> 1 ;
if(p<=m) update(p, add, lson) ;
else update(p, add, rson) ;
PushUp(rt) ;
}
int query(int L, int R, int l, int r, int rt){
if(L<=l&&r<=R){
return sum[rt] ;
}
int m = (l + r) >> 1 ;
int ret = 0 ;
if(L<=m) ret += query(L, R, lson) ;
if(R>m) ret += query(L, R, rson) ;
return ret ;
}
int main(){
int t=1, T, n, i, j, a, b ;
char str[10] ;
scanf("%d", &T) ;
while(T--){
scanf("%d", &n) ;
build(1, n, 1) ;
printf("Case %d:\n", t++) ;
while(1){
scanf("%s", str) ;
if(str[0]=='E') break ;
scanf("%d%d", &a, &b) ;
if(str[0]=='A') update(a, b, 1, n, 1) ;
else if(str[0]=='S') update(a, -b, 1, n, 1) ;
else printf("%d\n", query(a, b, 1, n, 1)) ;
}
}
return 0 ;}
最基础的线段树,单点更新。完全跟着HH的代码风格写的。
code:
#include<cstdio>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn = 50005 ;
int sum[maxn<<2] ;
void PushUp(int rt){
sum[rt] = sum[rt<<1] + sum[rt<<1|1] ;
}
void build(int l, int r, int rt){
if(l==r){
scanf("%d", &sum[rt]) ;
return ;
}
int m = (l + r) >> 1 ;
build(lson) ;
build(rson) ;
PushUp(rt) ;
}
void update(int p, int add, int l, int r, int rt){
if(l==r){
sum[rt] += add ;
return ;
}
int m = (l + r) >> 1 ;
if(p<=m) update(p, add, lson) ;
else update(p, add, rson) ;
PushUp(rt) ;
}
int query(int L, int R, int l, int r, int rt){
if(L<=l&&r<=R){
return sum[rt] ;
}
int m = (l + r) >> 1 ;
int ret = 0 ;
if(L<=m) ret += query(L, R, lson) ;
if(R>m) ret += query(L, R, rson) ;
return ret ;
}
int main(){
int t=1, T, n, i, j, a, b ;
char str[10] ;
scanf("%d", &T) ;
while(T--){
scanf("%d", &n) ;
build(1, n, 1) ;
printf("Case %d:\n", t++) ;
while(1){
scanf("%s", str) ;
if(str[0]=='E') break ;
scanf("%d%d", &a, &b) ;
if(str[0]=='A') update(a, b, 1, n, 1) ;
else if(str[0]=='S') update(a, -b, 1, n, 1) ;
else printf("%d\n", query(a, b, 1, n, 1)) ;
}
}
return 0 ;}
相关文章推荐
- HDU1166敌兵布阵-线段树求和
- hdu1166敌兵布阵 树状数组&线段树 单点更新求区间和
- HDU 1166 敌兵布阵(线段树)
- HDU 1166:敌兵布阵(线段树入门)
- 敌兵布阵 HDU - 1166 (线段树单点更新)
- HDU 1166 敌兵布阵(线段树)(第一部分 单点更新)
- HDU 1166 敌兵布阵【简单典型的线段树问题】
- HDU 1166 敌兵布阵[线段树单点更新成段查询]
- HDU 1166 敌兵布阵(线段树单点更新区间求和)
- HDU 1166 敌兵布阵(线段树单点更新)
- hdu 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵 (线段树单点更新+区间查询入门)
- HDU 1166 敌兵布阵【线段树】
- HDU 1166 敌兵布阵 线段树入门(线段树)
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- HDU - 1166 敌兵布阵 线段树区间查询
- HDU 1166 敌兵布阵 (线段树点更新区间查询)
- hdu 1166 敌兵布阵 线段树和树状数组
- HDU 1166 敌兵布阵(线段树单节点更新 区间求和)
- 线段树专题:hdu 1166敌兵布阵