HDU-1166 线段树模板
来源:互联网 发布:r9网络不稳定怎么回事 编辑:程序博客网 时间:2024/06/08 03:20
HDU-1166 线段树模板
题意
N(N<=50000)表示N个营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。
接下来每行有一条命令,命令有4种形式:
(1)Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令
思路
暴力显然超时,查询/更新的命令数目很大,考虑使用线段树。
代码
#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>#include <queue>#include <vector>#include <map>#include <set>#include <stack>using namespace std;#define lson l, m, rt * 2#define rson m + 1, r, rt * 2 + 1const int maxn = 50005;int a[maxn];int tree[maxn * 2];void pushup(int rt) //自下而上维护线段树{ tree[rt] = tree[rt * 2] + tree[rt * 2 + 1];}void build(int l, int r, int rt){ if (l == r) tree[rt] = a[l]; else { int m = (l + r) / 2; build(lson); build(rson); pushup(rt); }}int query(int a, int b, int l, int r, int rt) //询问操作{ if (a <= l && r <= b) return tree[rt]; int m = (l + r) / 2; int ans = 0; if (a <= m) ans += query(a, b, lson); if (m < b) ans += query(a, b, rson); return ans;}void update(int p, int c, int l, int r, int rt) //自下而上更新线段树{ if (l == r) { tree[rt] += c; } else { int m = (l + r) / 2; if (p <= m) update(p, c, lson); else update(p, c, rson); pushup(rt); }}int main(){ int T; scanf("%d", &T); for (int ii = 1; ii <= T; ++ii) { printf("Case %d:\n", ii); int n; scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); build(1, n, 1); char s[7]; while (scanf("%s", s) && s[0] != 'E') { int x, y; scanf("%d %d", &x, &y); if (s[0] == 'Q') printf("%d\n", query(x, y, 1, n, 1)); else if (s[0] == 'A') update(x, y, 1, n, 1); else if (s[0] == 'S') update(x, -y, 1, n, 1); } } return 0;}
阅读全文
0 0
- HDU-1166 线段树模板
- hdu 1166(线段树模板)
- hdu 1166 线段树,树状数组模板
- 【线段树】模板-HDU-1166-点改区查
- hdu 1166 敌兵布阵 线段树模板
- 线段树单点更新模板 HDU-1166
- HDU 1166 线段树模板&树状数组模板
- HDU 1754 线段树模板
- hdu 4578 线段树模板
- 线段树(单点更新(模板)) 之 hdu 1166
- 一维线段树模板 (HDU 1166)解题报告
- hdu 1166 敌兵布阵(线段树模板)
- HDU 1166 敌兵布阵 (线段树点更新/模板)
- HDU-1166 敌兵布阵(线段树模板题)
- HDU - 1166 A - 敌兵布阵 线段树单点更新模板
- hdu 1166 线段树 点更新(孙启龙模板)
- HDU 1166 敌兵布阵 (线段树点更新模板题)
- HDU 1166 树状数组&&线段树模板1
- MATLAB颜色的使用
- SQL数据库基本操作
- TapTap遭App Store下架 苹果热更新海啸来袭
- 在Intellij Idea创建部署第一个web项目(入门)
- Convert a Binary Tree to Doubly Linked List
- HDU-1166 线段树模板
- NAT技术
- mybatis学习之传统JDBC编程中的问题总结
- java 排序算法总结
- ZOJ 2734(Exchange Cards)
- maven的配置以及功能
- MAC下MySQL初始密码忘记怎么办
- Executor, ExecutorService 和 Executors 间的不同
- 【git】阿里云上传代码到github附SSH-KEY免密码上传&更新github代码到本地