P3130 [USACO15DEC]haybalesCounting Haybale P
还是一个模板题
只不过是用两个线段树:
- 存和
- 存最小值
#include <bits/stdc++.h>
#define int long long
#define N 200010
#define lson rt << 1
#define rson rt << 1 | 1
using namespace std;
struct node {
int min, sum, lazy, len;
} tree[N << 2];
int n, m;
int read() {
int s = 0, f = 0;
char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
return f ? -s : s;
}
void push_up(int rt) {
tree[rt].sum = tree[lson].sum + tree[rson].sum;
tree[rt].min = min(tree[lson].min, tree[rson].min);
}
void build(int rt, int l, int r) {
tree[rt].len = r - l + 1;
if (l == r) {
tree[rt].sum = tree[rt].min = read();
return;
}
int mid = (l + r) >> 1;
build(lson, l, mid);
build(rson, mid + 1, r);
push_up(rt);
}
void push_down(int rt) {
if (!tree[rt].lazy) return;
tree[lson].sum += tree[lson].len * tree[rt].lazy;
tree[rson].sum += tree[rson].len * tree[rt].lazy;
tree[lson].min += tree[rt].lazy;
tree[rson].min += tree[rt].lazy;
tree[lson].lazy += tree[rt].lazy;
tree[rson].lazy += tree[rt].lazy;
tree[rt].lazy = 0;
}
void update(int rt, int c, int l, int r, int L, int R) {
if (L <= l && r <= R) {
tree[rt].sum += tree[rt].len * c;
tree[rt].min += c;
tree[rt].lazy += c;
return;
}
push_down(rt);
int mid = (l + r) >> 1;
if (L <= mid) update(lson, c, l, mid, L, R);
if (R > mid) update(rson, c, mid + 1, r, L, R);
push_up(rt);
}
int query_sum(int rt, int l, int r, int L, int R) {
if (L <= l && r <= R) return tree[rt].sum;
push_down(rt);
int mid = (l + r) >> 1, ans = 0;
if (L <= mid) ans += query_sum(lson, l, mid, L, R);
if (R > mid) ans += query_sum(rson, mid + 1, r, L, R);
return ans;
}
int query_min(int rt, int l, int r, int L, int R) {
if (L <= l && r <= R) return tree[rt].min;
push_down(rt);
int mid = (l + r) >> 1, ans = 2147483647;
if (L <= mid) ans = min(ans, query_min(lson, l, mid, L, R));
if (R > mid) ans = min(ans, query_min(rson, mid + 1, r, L, R));
return ans;
}
signed main() {
n=read();
m=read();
char sy;
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int x,y,d;
cin >> sy;
if (sy == 'P') {
x = read(), y = read(), d = read();
update(1, d, 1, n, x, y);
}
if (sy == 'M') {
x = read(), y = read();
printf("%lld\n", query_min(1, 1, n, x, y));
}
if (sy == 'S') {
x = read(), y = read();
printf("%lld\n", query_sum(1, 1, n, x, y));
}
}
return 0;
}
CSP-J-S 2021 RP++ ONE DAY LEFT