HDU 1166 敌兵布阵(线段树)
2015-04-01 22:34
337 查看
单点更新
代码挺容易懂的,我就不多说了
查询的时候注意一点就可以了
代码挺容易懂的,我就不多说了
查询的时候注意一点就可以了
#include <stdio.h> #define maxn 50005 int ans; struct { int l, r, sum; int mid() { return (l + r)>>1; } }node[maxn*4]; void buildtree(int left, int right, int u) { node[u].l = left; node[u].r = right; if(left == right) { scanf("%d",&node[u].sum); return; } int mid = node[u].mid(); buildtree(left, mid, u<<1); buildtree(mid+1, right, u<<1|1); node[u].sum = node[u<<1].sum + node[u<<1|1].sum; } void update(int b, int s, int left, int right, int u) { if(left==right) { node[u].sum+=s; return; } int mid = node[u].mid(); if(b<=mid) update(b, s, left, mid, u<<1); else if(b>mid) update(b, s, mid+1, right, u<<1|1); node[u].sum = node[u<<1].sum + node[u<<1|1].sum; } void query(int b, int s, int left, int right, int u) { if(b<=left && right<=s) { ans+=node[u].sum; return; } int mid = node[u].mid(); if(s<=mid) query(b, s, left, mid, u<<1); else if(mid<b) query(b, s, mid+1, right, u<<1|1); else { query(b, s, left, mid, u<<1); query(b, s, mid+1, right, u<<1|1); } } int main() { int t; char str[10]; scanf("%d",&t); int cas=1; while(t--) { int n; scanf("%d",&n); buildtree(1, n, 1); printf("Case %d:\n",cas++); getchar(); while(scanf("%s",str)!=EOF) { int b,s; getchar(); if(str[0]=='E') break; scanf("%d%d",&b,&s); if(str[0]=='A') { update(b, s, 1, n, 1); } else if(str[0]=='S') { update(b, -s, 1, n, 1); } else { ans=0; query(b, s, 1, n, 1); printf("%d\n",ans); } } } return 0; }
相关文章推荐
- hdu 1166 敌兵布阵 (zkw线段树)
- HDU-1166 敌兵布阵 ( 线段树 )
- hdu 1166 敌兵布阵 (线段树)
- hdu1166敌兵布阵 (线段树)
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- HDU 1166 敌兵布阵(线段树单点更新)
- hdu 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵(树状数组 or 线段树 单点修改 区间求和)
- hdu 1166 敌兵布阵 线段树
- HDU1166 -敌兵布阵(线段树)
- HDU 1166 敌兵布阵 (线段树)
- hdu 1166 敌兵布阵(线段树基础题)
- hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)
- 线段树经典——HDU 1166(敌兵布阵)
- HDU 1166 敌兵布阵 (线段树入门_纪念一下)
- HDU - 1166 - 敌兵布阵 (树状数组 or 线段树)
- HDU 1166-敌兵布阵(线段树单节点更新)
- HDU 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵(线段树)
- HDU-1166敌兵布阵(线段树)