分块10分AC#1求调
查看原帖
分块10分AC#1求调
995934
fkxr楼主2024/10/8 19:51
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200005], id[200005], sum[2005], minn[2005], f[2005], len;

int mn(int l, int r) {
	int q = id[l], w = id[r];
	int ans = 1e18;
	if (q == w) {
		for (int i = l; i <= r; i++) {
			ans = min(ans, a[i] + f[q]);
		}
		return ans;
	}
	for (int i = l; id[i] == q; i++) {
		ans = min(ans, a[i] + f[q]);
	}
	for (int i = r; id[i] == w; i--) {
		ans = min(ans, a[i] + f[w]);
	}
	for (int i = q + 1; i < w; i++) {
		ans = min(ans, minn[i]);
	}
	return ans;
}

int he(int l, int r) {
	int q = id[l], w = id[r];
	int ans = 0;
	if (q == w) {
		for (int i = l; i <= r; i++) {
			ans += a[i] + f[q];
		}
		return ans;
	}
	for (int i = l; id[i] == q; i++) {
		ans += a[i] + f[q];
	}
	for (int i = r; id[i] == w; i--) {
		ans += a[i] + f[w];
	}
	for (int i = q + 1; i < w; i++) {
		ans += sum[i] + f[i] * len;
	}
	return ans;
}

void gai(int l, int r, int c) {
	int q = id[l], w = id[r];
	if (q == w) {
		for (int i = l; i < r; i++) {
			a[i] += c;
		}
		sum[q] = 0;
		minn[q] = 1e18;
		for (int i = q * len; id[i] == q; i++) {
			minn[q] = min(minn[q], a[i] + f[i]);
			sum[q] += a[i];
		}
	}
	for (int i = l; id[i] == q; i++) {
		a[i] += c;
	}
	sum[q] = 0;
	minn[q] = 1e18;
	for (int i = q * len; id[i] == q; i++) {
		minn[q] = min(minn[q], a[i] + f[i]);
		sum[q] += a[i];
	}
	for (int i = r; id[i] == w; i--) {
		a[i] += c;
	}
	sum[w] = 0;
	minn[w] = 1e18;
	for (int i = w * len; id[i] == w; i++) {
		minn[w] = min(minn[w], a[i] + f[i]);
		sum[w] += a[i];
	}
	for (int i = q + 1; i < w; i++) {
		f[i] += c;
		minn[i] += c;
	}
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n, m;
	cin >> n >> m;
	len = sqrt(n);
	for (int i = 0; i <= len + 1; i++) {
		minn[i] = 1e18;
	}
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		id[i] = i / len;
		minn[id[i]] = min(minn[id[i]], a[i]);
		sum[id[i]] += a[i];
	}
	for (; m--;) {
		string s;
		cin >> s;
		int l, r;
		cin >> l >> r;
		if (s == "M") {
			cout << mn(l - 1, r - 1) << "\n";
		} else if (s == "S") {
			cout << he(l - 1, r - 1) << "\n";
		} else {
			int p;
			cin >> p;
			gai(l - 1, r - 1, p);
		}
	}
	return 0;
}
2024/10/8 19:51
加载中...