hdu 1166 敌兵布阵(线段树单点更新)
2015-11-08 17:50
477 查看
题意:单点更新线段树,求区间和。
线段树:http://blog.csdn.net/metalseed/article/details/8039326
线段树:http://blog.csdn.net/metalseed/article/details/8039326
#include<cstring> #include<iostream> #define M 50005 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 /*left,right,root,middle*/ int sum[M<<2]; inline void PushPlus(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); PushPlus(rt); } void Updata(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) Updata(p, add, lson); else Updata(p, add, rson); PushPlus(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 ans=0; if(L<=m ) ans+=Query(L,R,lson); if(R>m) ans+=Query(L,R,rson); return ans; } int main() { int T, n, a, b; scanf("%d",&T); for( int i = 1; i <= T; ++i ) { printf("Case %d:\n",i); scanf("%d",&n); Build(1,n,1); char op[10]; while( scanf("%s",op) &&op[0]!='E' ) { scanf("%d %d", &a, &b); if(op[0] == 'Q') printf("%d\n",Query(a,b,1,n,1)); else if(op[0] == 'S') Updata(a,-b,1,n,1); else Updata(a,b,1,n,1); } } return 0; }
相关文章推荐
- android导入存在的项目
- c语言 数学函数 math.h
- We7<001>--We7 CMS之报错: HTTP 错误 404.0 - Not Found 您要找的资源已被删除、已更名或暂时不可用。
- DP--ZOJ - 1074 To the Max
- poj1094Sorting It All Out(拓扑排序)
- MySql中delimiter
- iOS开发-UIApplicationMain 函数的功能
- hdu5551Huatuo's Medicine(The 2015 China Collegiate Programming Contest )
- 典型用户
- c语言 数据类型
- I have a Drea -by Martin Luther King
- Android 中解决图片加载OOM 之 bitmap 压缩显示,压缩上传
- MapKit的基本使用
- CSS3扩展技术
- Java内存回收机制(第三讲)
- hdu5540 Secrete Master Plan(The 2015 China Collegiate Programming Contest )
- c语言 结构体
- 【惊爆】马哥linux2016最新全套课程(内部泄密版)
- iOS开发-内存管理
- 汇编语言-标志寄存器