hdu 1166 敌兵布阵 (线段树、树状数组模板,单点更新)
来源:互联网 发布:歼十c的性能数据 编辑:程序博客网 时间:2024/05/21 17:14
hdu 1166
方法1:线段树
#include <iostream>#include<algorithm>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 55555;struct node{int l, r;int val;};int a[MAXN];node T[MAXN * 4 + 10];void build(int rt, int begin, int end) {if(begin == end) {T[rt].val = a[begin];T[rt].l = begin;T[rt].r = end;}else {int mid = (begin + end) >> 1;build(rt << 1, begin, mid);build(rt << 1 | 1, mid + 1, end);T[rt].val = T[rt << 1].val + T[rt << 1 | 1].val;T[rt].l = begin;T[rt].r = end;}}void updata(int rt, int id, int add) {if(T[rt].l == T[rt].r) {T[rt].val += add;}else {int mid = (T[rt].l + T[rt].r) >> 1;if(id <= mid) updata(rt << 1, id, add);else updata(rt << 1 | 1, id, add);T[rt].val = T[rt << 1].val + T[rt << 1 | 1].val;}}int query(int rt, int l, int r) {if(T[rt].l >= l && T[rt].r <= r) {return T[rt].val;}else {int mid = (T[rt].l + T[rt].r) >> 1;if(r <= mid) return query(rt << 1, l, r);else if(l > mid) return query(rt << 1 | 1, l, r);else return query(rt << 1, l, mid) + query(rt << 1 | 1, mid + 1, r);}}int main() {//freopen("input.txt", "r", stdin);int T;scanf("%d", &T);int N;int j;for(j = 1; j <= T; j++) {printf("Case %d:\n", j);scanf("%d", &N);int i;for(i = 1; i <= N; i++) {scanf("%d", a + i);}build(1, 1, N); char str[10]; int x, y; while(1) { scanf("%s", str); if(str[0] == 'E') break; //此处注意runtime error scanf("%d %d", &x, &y); if(str[0] == 'Q') { printf("%d\n", query(1, x, y));}else if(str[0] == 'A') {updata(1, x, y);}else {updata(1, x, -y);}}} return 0;}
方法2: 树状数组
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 50005;int sum[maxn], N;int lowbit(int x) {return x & (-x);}void update(int index, int val) {int i;for(i = index; i <= N; i += lowbit(i)) {sum[i] += val;}}int getsum(int index) {int i;int res = 0;for(i = index; i > 0; i -= lowbit(i)) {res += sum[i];}return res;}int main() {int T;int kase = 1;scanf("%d", &T);while(T--) {printf("Case %d:\n", kase++);scanf("%d", &N);memset(sum, 0, sizeof(sum));int i, tmp;for(i = 1; i <= N; i++) {scanf("%d", &tmp);update(i, tmp);}string str;int n, m;while (cin >> str) { if (str == "End") break; scanf("%d%d", &n, &m); if (str == "Query") printf("%d\n", getsum(m) - getsum(n - 1)); else if (str == "Add") update(n, m); else update(n, -m); }}return 0;}
0 0
- hdu 1166 敌兵布阵 (线段树、树状数组模板,单点更新)
- 树状数组、线段树模板(一)——单点更新 + HDU 1166 敌兵布阵
- HDU 1166-敌兵布阵【树状数组&&线段树单点更新】【模板】
- hdu 1166 敌兵布阵(基础树状数组)(基础线段树--单点更新)
- HDU 1166 敌兵布阵 (树状数组 || 线段树单点更新)
- HDU 1166 敌兵布阵(树状数组||线段树单点更新)
- hdu1166 敌兵布阵(树状数组 && 线段树单点更新)
- HDU - 1166 A - 敌兵布阵 线段树单点更新模板
- hdu 1166 敌兵布阵 单点更新 树状数组 线段树 两种做法
- HDU 1166 敌兵布阵【线段树,树状数组入门题,单点更新,区间求和】
- HDU 1166 敌兵布阵(树状数组 or 线段树 单点修改 区间求和)
- Hdu-1166 敌兵布阵【线段树(单点更新)】
- hdu 1166 敌兵布阵(线段树,单点更新)
- hdu 1166 敌兵布阵(线段树-单点更新)
- hdu 1166 敌兵布阵 线段树(单点更新)
- [ACM] hdu 1166 敌兵布阵 (线段树,单点更新)
- HDU 1166 敌兵布阵(线段树入门,单点更新)
- HDU 1166-敌兵布阵(线段树_单点更新)
- Android NDK Eclipse断点JNI调试C++基础详解
- OpenCV2411 数据类型
- spring mvc 中controller是非线程安全的
- TOEFL(20151220)分析
- Linux(一)——文本模式指令
- hdu 1166 敌兵布阵 (线段树、树状数组模板,单点更新)
- Android:Paint的setMaskFilter(MaskFilter maskfilter)
- poj 3061 Subsequence (尺取法)
- MySQL 存储过程和定时器的应用
- Amicable numbers
- 理解Android之ThreadLocal
- 电商系统Broadleaf文档翻译(二) - 推荐服务器配置server configuration
- 对js,jq 下div的各种宽度高度的小结
- 酷狗歌词API