萌新求助 loj 6280 分块入门
  • 板块题目总版
  • 楼主xiaoming007
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/5 20:06
  • 上次更新2023/11/2 22:38:30
查看原帖
萌新求助 loj 6280 分块入门
938449
xiaoming007楼主2023/9/5 20:06

rt,过样例但 0 分。

#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
ll a[101010], sum[101010], tag[101010], id[101010], siz[101010], q[101010];
int main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n, len = 0, kc;
	cin >> n;
	kc = sqrt(n);
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		if ((i - 1) % kc == 0) {
			siz[len] = kc;
			++len;
		}
		id[i] = len;
		sum[len] += a[i];
	}
	id[n+1] = len+1;
	siz[0] = 0;
	siz[len] = n % kc ? n % kc : kc;
	for (int i = 1; i <= len; ++i) q[i] = q[i-1] + siz[i];
	auto update = [&](ll l, ll r, ll c) -> void {
		int L = id[l - 1] + 1, R = id[r + 1] - 1;
		for (int i = L; i <= R; ++i) {
			tag[i] += c;
			sum[i] += c * siz[i];
		}
		for (int i = q[L - 1]; i >= l; --i) {
			sum[id[i]] += c;
			a[i] += c;
		}
		for (int i = q[R] + 1; i <= r; ++i) {
			sum[id[i]] += c;
			a[i] += c;
		}
	};
	auto getsum = [&](ll l, ll r, ll c) -> ll {
		int L = id[l - 1] + 1, R = id[r + 1] - 1;
		ll ans = 0;
		for (int i = L; i <= R; ++i) ans += sum[i];
		for (int i = q[L - 1]; i >= l; --i) {
			ans += a[i] + tag[id[i]];
		}
		for (int i = q[R] + 1; i <= r; ++i) {
			ans += a[i] + tag[id[i]];
		}
		return ans;
	};
	while (n--) {
		ll opt, l, r, c;
		cin >> opt >> l >> r >> c;
		if (opt == 0) update(l, r, c);
		else {
			cout << getsum(l, r, c) % (c + 1) << '\n';
		}
	}
	return 0;
}
2023/9/5 20:06
加载中...