线段树 WA on #5 求调
查看原帖
线段树 WA on #5 求调
694172
Dawn_chen楼主2023/11/21 22:39

RT, 记录。

代码如下。

#include <iostream>
#include <cstdio>
using namespace std;
#define int long long
#define N 200010

int n, m, spc;

int read() {
	int x = 0, f = 1;
	char c = getchar();
	while(c < '0' || c > '9') {
		if(c == '-') {
			f *= - 1; c = getchar(); 
		}
	}
	while(c >= '0' && c <= '9') {
		x = x * 10 + (c - '0');
		c = getchar();
	}
	if(c == ' ') spc ++;
	return x * f;
}

int d[N * 4], lzy[N * 4], a[N];

void build(int l, int r, int p) {
	if(l == r) {
		d[p] = a[l];
		return;
	}
	int m = l + (r - l) / 2;
	build(l, m, p * 2);
	build(m + 1, r, p * 2 + 1);
	d[p] = std::min(d[p * 2], d[p * 2 + 1]);
}

void maketag(int p, int len, int x) {
	d[p] += len * x; lzy[p] += x;
}

void pushdown(int l, int r, int p) {
	int m = l + (r - l) / 2;
	maketag(p * 2, m - l + 1, lzy[p]);
	maketag(p * 2 + 1, r - m, lzy[p]);
	lzy[p] = 0;
}

void update(int l, int r, int L, int R, int p, int x) {
	if(L <= l && r <= R) {
		maketag(p, r - l + 1, x);
		return;
	}
	int m = l + (r - l) / 2;
	pushdown(l, r, p);
	if(m < R) update(m + 1, r, L, R, p * 2 + 1, x);
	if(m >= L) update(l, m, L, R, p * 2, x);
	d[p] = std::min(d[p * 2], d[p * 2 + 1]);
}

int query(int l, int r, int L, int R, int p) {
	if(L <= l && r <= R) return d[p];
	int m = l + (r - l) / 2, res = 0x3f3f3f3f;
	pushdown(l, r, p);
	if(m >= L) res = std::min(res, query(l, m, L, R, p * 2));
	if(m < R) res = std::min(res, query(m + 1, r, L, R, p * 2 + 1));
	return res;
}

void check() {
	for(int i = 1; i <= n; i ++) cout << a[i] << " ";
	cout << "\n";
}

signed main() {
	n = read();
	for(int i = 1; i <= n; i ++) a[i] = read();
	m = read();
	build(1, n, 1);
	while(m --) {
		spc = 0;
		int x = read(), y = read();
		x ++, y ++;
		if(spc == 2) {
			int z = read();
			if(x <= y) update(1, n, x, y, 1, z);
			else {
				update(1, n, x, n, 1, z);
				update(1, n, 1, y, 1, z);
			}
		}
		else {
			if(x <= y) cout << query(1, n, x, y, 1) << "\n";
			else {
				cout << std::min(query(1, n, x, n, 1), query(1, n, 1, y, 1)) << "\n";
			}
		}
	}
	return 0;
}

可能不能及时回复请见谅。

2023/11/21 22:39
加载中...