P3130 [USACO15DEC]haybalesCounting Haybale P

P3130 [USACO15DEC]haybalesCounting Haybale P

还是一个模板题
只不过是用两个线段树:

  1. 存和
  2. 存最小值
#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

Guess you like

Origin blog.csdn.net/weixin_45446715/article/details/120887755