赛前再巩固一下线段树,又做了一遍kuangbin线段树专题
专题链接:kuangbin专题题目一览
1. HDU 1166 敌兵布阵
区间维护和,单点修改
#include <stdio.h>
using namespace std;
const int MAXN=1e5 + 10;
int origin[MAXN], tree[MAXN<<2];
void pushup(int p) {
tree[p] = tree[p << 1] + tree[p << 1 | 1];
}
void build(int p, int l, int r) {
if (l == r) {
tree[p] = origin[l];
return;
}
int mid = (l + r) >> 1;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
pushup(p);
}
void update_node(int p, int l,int r, int q,int v) {
if (l == r) { //查询到点
tree[p] += v;
return;
}
int mid = (l + r) >> 1;
if (q > mid) update_node(p << 1 | 1, mid + 1, r, q, v);
else update_node(p << 1, l, mid, q, v);
pushup(p);
}
int query(int p, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return tree[p]; //被包含在询问区域内的区间(有效的部分)
int mid = (l + r) >> 1;
int temp = 0;
if (qr > mid) temp += query(p << 1 | 1, mid + 1, r, ql, qr); //分块切割出有效的部分(已忽略无效部分)
if (ql <= mid) temp += query(p << 1, l, mid, ql, qr);
return temp;
}
int main () {
int T;
scanf("%d", &T);
for (int k = 1; k <= T; k++) {
int n, i, j;
char s[10];
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", origin + i);
build(1, 1, n);
printf("Case %d:\n", k);
while(scanf("%s", s) && s[0] != 'E') {
scanf("%d%d", &i, &j);
if (s[0] == 'A')
update_node(1, 1, n, i, j);
else if (s[0] == 'S')
update_node(1, 1, n, i, -j);
else
printf("%d\n", query(1, 1, n, i, j));
}
}
}
2. HDU 1754 I Hate It
维护区间最大值,单点修改<