[HDU]1166 敌兵布阵 (线段树--单点更新,区间求和)
来源:互联网 发布:linux dhcp安装包 编辑:程序博客网 时间:2024/05/16 07:14
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
题目大意:第一行一个整数T,表示有T组数据。每组数据第一行一个正整数N,表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人。接下来每行有一条命令,命令有4种形式:(1) Add i j,i和j为正整数,表示第i个营地增加j个人;(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人; (3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;(4)End 表示结束,这条命令在每组数据最后出现;
数据范围: 1 <= N <= 50000;1 <= ai <= 50;1 <= j <= 30;
题目解答:线段树--单点更新,区间求和(复杂度:O(M*logN),M为命令数)
#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <iostream>#include <algorithm>#include <string>using namespace std;#define lson rt << 1, l, m#define rson rt << 1|1, m + 1, rconst int maxn = 50010;int tree[maxn<<2]; ///存树数组int lazy[maxn<<2]; ///懒惰标记int n;///区间求和pushinline void pushup(int rt){ tree[rt] = tree[rt<<1]+tree[rt<<1|1];}///建树 ///注意默认值为1 - n,有时区间要用0 - n-1,都要改void build(int rt = 1, int l = 1, int r = n){ if(l == r) { scanf("%d", &tree[rt]); return; } int m = (l+r) >> 1; build(lson); build(rson); pushup(rt);}///单点操作updatevoid update(int p, int del, int rt = 1, int l = 1, int r = n){ if(l == r) { tree[rt] += del; return; } int m = (l+r)>>1; if(p <= m) update(p, del, lson); else update(p, del, rson); pushup(rt);}///区间数值查询int query(int L, int R, int rt = 1, int l = 1, int r = n){ if(L <= l && r <= R) return tree[rt];// if(lazy[rt]) pushdown(rt, r-l+1); int m = (l+r)>>1, ret = 0; if(L <= m) ret += query(L, R, lson); if(R > m) ret += query(L, R, rson); return ret;}char s[10];int main(){ int t, ca = 1; scanf("%d", &t); while(t--) { scanf("%d", &n); build(1, 1, n); printf("Case %d:\n", ca++); while(scanf("%s", s), s[0] != 'E') { int l, r; scanf("%d%d", &l, &r); if(s[0] == 'Q') { printf("%d\n", query(l , r)); } else if(s[0] == 'A') { update(l, r); } else { update(l, -r); } } } return 0;}
0 0
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- hdu 1166 敌兵布阵【线段树】单点更新,区间求和
- hdu 1166 敌兵布阵 (线段树 单点更新 区间求和)
- hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)
- hdu 1166 敌兵布阵(线段树-单点更新,区间求和)
- HDU 1166-敌兵布阵(线段树:单点更新,区间求和)
- [HDU]1166 敌兵布阵 (线段树--单点更新,区间求和)
- HDU 1166 敌兵布阵(线段树单点更新+区间求和)
- hdu1166 敌兵布阵(线段树单点更新+区间求和)
- 学习线段树-【线段树-单点更新,区间求和】hdu 1166 -敌兵布阵
- HDU 1166 敌兵布阵 (线段树 单点增减, 区间求和)
- hdu 1166 敌兵布阵(单点更新及区间求和)
- hdu 1166 敌兵布阵 (单点更新,区间求和)
- HDU 1166 敌兵布阵【线段树,树状数组入门题,单点更新,区间求和】
- hdu 1166 敌兵布阵(线段树单点更新求和)
- HDU 1166 敌兵布阵(线段树:点更新,区间求和)
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
- hdu 1166 敌兵布阵(线段树单点更新(a位置的值+/-b)+区间求和)
- Activity : 状态保存与恢复
- 理解AngularJS中的依赖注入
- Java面向对象-抽象类
- JVM 调优参数详解(转)
- Android中使用Socket
- [HDU]1166 敌兵布阵 (线段树--单点更新,区间求和)
- LINUX文件编译
- 失踪几个月的程序员又回来了,于是他带来他自己的手机端网站。
- libuuid.so 崩溃问题
- Java面向对象--接口
- 最好用的API调试接口 在线接口测试工具
- JavaScript 注册登录页面的简单实现
- 查看SD卡
- 【BZOJ1059】[ZJOI2007][二分图匹配]矩阵游戏