HDU 1166 树状数组&&线段树模板1
来源:互联网 发布:布罗代尔 知乎 编辑:程序博客网 时间:2024/06/16 14:15
累计sum值。单点更新、区间查询。
Input
第一行一个整数T,表示有T组数据。
每组数据第一行一个正整数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条命令
Output
对第i组数据,首先输出“Case i:”和回车,
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。
树状数组:
#include <bits/stdc++.h>using namespace std;const int maxn = 50000;int tree[maxn + 10];char op[10];inline int lowbit(int x) { return (x & -x);}void add(int x, int val) { while(x <= maxn) { tree[x] += val; x += lowbit(x); }}int get(int x) { int sum = 0; while(x) { sum += tree[x]; x -= lowbit(x); } return sum;}int main() { int T; scanf("%d", &T); for(int cas = 1; cas <= T; ++ cas) { printf("Case %d:\n", cas); memset(tree, 0, sizeof(tree)); int n, x, y, val; scanf("%d", &n); for(int i = 1; i <= n; ++ i) scanf("%d", &val), add(i, val); while(1) { scanf("%s", &op); if(op[0] == 'Q') scanf("%d%d", &x, &y), printf("%d\n", get(y) - get(x-1)); else if(op[0] == 'A') scanf("%d%d", &x, &val), add(x, val); else if(op[0] == 'S') scanf("%d%d", &x, &val), add(x, -val); else if(op[0] == 'E') break; } }}
线段树:
#include <bits/stdc++.h>using namespace std;const int maxn = 50000;int tree[maxn * 4];int a[maxn + 5];void create(int o, int L, int R) { if(L == R) { tree[o] = a[L]; return; } int mid = L + R >> 1; create(o * 2, L, mid); create(o * 2 + 1, mid+1, R); tree[o] = tree[o * 2] + tree[o * 2 + 1];}int query(int o, int L, int R, int ql, int qr) { //越界返回 if(ql > R || qr < L) return 0; //包含返回 if(ql <= L && R <= qr) return tree[o]; //累加左右孩子并返回 int mid = L + R >> 1; int ans = 0; ans += query(o * 2, L, mid, ql, qr); ans += query(o * 2 + 1, mid + 1, R, ql, qr); return ans;}void update(int o, int L, int R, int pos, int val) { //越界返回 if(pos < L || pos > R) return; //点更新 if(L == R && L == pos) { tree[o] += val; return; } //向下更新 int mid = L + R >> 1; update(o * 2, L, mid, pos, val); update(o * 2 + 1, mid + 1, R, pos, val); tree[o] = tree[o * 2] + tree[o * 2 + 1];}int main() { int T; char op[10]; scanf("%d", &T); for(int cas = 1; cas <= T; ++ cas) { printf("Case %d:\n", cas); memset(tree, 0, sizeof(tree)); int n, x, y, val; scanf("%d", &n); for(int i = 1; i <= n; ++ i) scanf("%d", a + i); create(1, 1, n); while(1) { scanf("%s", &op); if(op[0] == 'Q') scanf("%d%d", &x, &y), printf("%d\n", query(1, 1, n, x, y)); else if(op[0] == 'A') scanf("%d%d", &x, &val), update(1, 1, n, x, val); else if(op[0] == 'S') scanf("%d%d", &x, &val), update(1, 1, n, x, -val); else if(op[0] == 'E') break; } }}
阅读全文
0 0
- hdu 1166 线段树,树状数组模板
- HDU 1166 树状数组&&线段树模板1
- HDU 1166 线段树模板&树状数组模板
- 树状数组 线段树 模板
- 线段树+树状数组模板
- 线段树, 树状数组模板
- hdu 1166 线段树/树状数组
- hdu 1166 树状数组 & 线段树
- hdu 1166 树状数组 线段树
- hdu 1166_线段树&树状数组
- HDU 1166(线段树;树状数组)
- hdu 1166 树状数组 线段树入门
- hdu 1166 树状数组 线段树
- hdu 1166(线段树或者树状数组)
- HDU 1166 树状数组和线段树
- 线段树模板&&树状数组模板
- 树状数组、线段树模板(一)——单点更新 + HDU 1166 敌兵布阵
- HDU 1166 敌兵布阵 (我的树状数组加线段树点修改模板)
- Gerrit使用简介
- workstation上虚拟机如何与主机共享文件夹
- 微信emoji、gif图片的实现及小米一键清除逻辑
- 英语语法基础_限定词(数量限定词)
- 缓存初探
- HDU 1166 树状数组&&线段树模板1
- python protoc
- antd mobile(五)react-router界面切换动画
- 树的重量(树+枚举)
- JavaScript DOM对象
- python3--字典
- iOS 怎样获得设备及应用相关信息
- UVa --- 11210 中国麻将【暴力深搜】
- apt-get下载、安装的软件在哪里