首页 > 代码库 > hdu 1116 敌兵布阵 线段树 区间求和 单点更新
hdu 1116 敌兵布阵 线段树 区间求和 单点更新
线段树的基本知识可以先google一下,不是很难理解
线段树功能:update:单点增减 query:区间求和
#include <bits/stdc++.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1using namespace std;const int MAXN = 50008;int sum[MAXN<<2];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); sum[rt] = sum[rt<<1] + sum[rt<<1|1];}int query(int L, int R, int l, int r, int rt){ if(L <= l && r <= R) return sum[rt]; int ret = 0; int m = (l + r) >> 1; if(L <= m) ret += query(L, R, lson); if(R > m) ret += query(L, R, rson); return ret;}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); sum[rt] = sum[rt<<1] + sum[rt<<1|1];}int main(){// freopen("in.txt", "r", stdin); int T, Case = 0; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); build(1, n, 1); printf("Case %d:\n", ++Case); char s[10]; while(~scanf("%s", s)) { if(s[0] == ‘E‘) break; int a,b; scanf("%d%d", &a, &b); if(s[0] == ‘Q‘) printf("%d\n", query(a, b, 1, n, 1)); else if(s[0] == ‘A‘) updata(a, b, 1, n, 1); else updata(a, -b, 1, n, 1); } } return 0;}
hdu 1116 敌兵布阵 线段树 区间求和 单点更新
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。