分块求调
  • 板块学术版
  • 楼主zMinYu
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/23 15:03
  • 上次更新2023/11/2 11:43:38
查看原帖
分块求调
882092
zMinYu楼主2023/10/23 15:03
#include <bits/stdc++.h>
using namespace std;
const int N = 50000 + 7;
const int S = sqrt(N) + 5;
int n, block_len, s;
int bg[S], ed[S], loc[N];
long long a[N], sum[S], add[S];
void modify(int l, int r, int c) {
	if (loc[l] == loc[r]) {
		for (int i = l; i <= r; i++) a[i] += c;
		sum[loc[l]] += c * (r - l + 1);
	} else {
		for (int i = loc[l] + 1; i <= loc[r] - 1; i++) add[i] += c;
		for (int i = l; i <= ed[loc[l]]; i++) a[i] += c;
		sum[loc[l]] += c * (ed[loc[l]] - l + 1);
		for (int i = bg[loc[r]]; i <= r; i++) a[i] += c;
		sum[loc[r]] += c * (r - bg[loc[r]] + 1);
	}
	return;
}
long long query(int l, int r, int c) {
	long long ans = 0;
	c++;
	if (loc[l] == loc[r]) {
		for (int i = l; i <= r; i++) ans = (ans + a[i]) % c;
		ans = (ans + add[loc[l]] * (r - l + 1)) % c;
	} else {
		for (int i = loc[l] + 1; i <= loc[r] - 1; i++) ans = (ans + sum[i] + add[i] * (ed[i] - bg[i] + 1)) % c;
		for (int i = l; i <= ed[loc[l]]; i++) ans = (ans + a[i]) % c;
		ans = (ans + add[loc[l]] * (ed[loc[l]] - l + 1)) % c;
		for (int i = bg[loc[r]]; i <= r; i++) ans = (ans + a[i]) % c;
		ans = (ans + add[loc[r]] * (r - bg[loc[r]] + 1)) % c;
	}
	return ans % c;
}
int main() {
	cin >> n;
	block_len = sqrt(n);
	s = n / block_len;
	for (int i = 1; i <= s; i++) {
		bg[i] = (i - 1) * block_len + 1;
		ed[i] = i * block_len;
	}
	ed[s] = n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		loc[i] = ceil(1.000 * i / block_len);
	}
	memset(sum, 0, sizeof(sum));
	memset(add, 0, sizeof(add));
	for (int i = 1; i <= s; i++) {
		for (int j = bg[i]; j <= ed[i]; j++) {
			sum[i] += a[j];
		}
	}
	int m = n;
	int opt, l, r, c;
	while (m--) {
		cin >> opt >> l >> r >> c;
		if (opt == 0) {
			modify(l, r, c);
		}
		if (opt == 1) {
			cout << query(l, r, c) << '\n';
		}
	}
	return 0;
}

题目。

我瞪不出来了。。。

2023/10/23 15:03
加载中...