分块 WA on #3 求助
查看原帖
分块 WA on #3 求助
882092
zMinYu楼主2023/10/27 21:24
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
const int S = sqrt(N) + 7;
int n, m;
int a[N], sum[S], block_len, loc[N], bg[S], ed[S], s, maxn[S];
void modify_change(int k, int x) {
	sum[loc[k]] += x - a[k];
	a[k] = x;
//	maxn[loc[k]] = max(maxn[loc[k]], x);
	maxn[loc[k]] = 0;
	for (int i = bg[loc[k]]; i <= ed[loc[k]]; i++) maxn[loc[k]] = max(maxn[loc[k]], a[i]);
	return;
}
void modify_mod(int l, int r, int x) {
	if (loc[l] == loc[r]) {
		for (int i = l; i <= r; i++) {
			sum[loc[l]] = sum[loc[l]] - a[i] + (a[i] % x);
			a[i] %= x;
		}
	} else {
		for (int i = l; i <= ed[loc[l]]; i++) {
			sum[loc[l]] = sum[loc[l]] - a[i] + (a[i] % x);
			a[i] %= x;
		}
		for (int i = bg[loc[r]]; i <= r; i++) {
			sum[loc[r]] = sum[loc[r]] - a[i] + (a[i] % x);
			a[i] %= x;
		}
		for (int i = bg[loc[r]]; i <= r; i++) {
			sum[loc[r]] = sum[loc[r]] - a[i] + (a[i] % x);
			a[i] %= x;
		}
		for (int i = loc[l] + 1; i <= loc[r] - 1; i++) {
			if (x >= maxn[i]) {
				for (int j = bg[loc[i]]; j <= ed[loc[i]]; j++) {
					sum[loc[i]] = sum[loc[i]] - a[j] + (a[j] % x);
					a[j] %= x;
				}
			}
		}
	}
}
long long query(int l, int r) {
	long long  ans = 0;
	if (loc[l] == loc[r]) {
		for (int i = l; i <= r; i++)
			ans += a[i];
	} else {
		for (int i = l; i <= ed[loc[l]]; i++)
			ans += a[i];
		for (int i = bg[loc[r]]; i <= r; i++)
			ans += a[i];
		for (int i = loc[l] + 1; i <= loc[r] - 1; i++) {
			ans += sum[i];
		}
	}
	return ans;
}
int main() {
	cin >> n >> m;
	block_len = sqrt(n);
	s = ceil(1.000 * n / block_len);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		loc[i] = ceil(1.000 * i / block_len);
	}
	for (int i = 1; i <= s; i++) {
		bg[i] = (i - 1) * block_len + 1;
		ed[i] = i * block_len;
	}
	ed[s] = n;
	memset(maxn, 0, sizeof(maxn));
	memset(sum, 0, sizeof(sum));
	for (int i = 1; i <= s; i++) {
		for (int j = bg[i]; j <= ed[i]; j++) {
			sum[i] += a[j];
			maxn[i] = max(maxn[i], a[j]);
		}
	}
	int opt, l, r, x;
	while (m--) {
		cin >> opt;
		if (opt == 1) {
			cin >> l >> r;
			cout << query(l, r) << '\n';
		} else if (opt == 2){
			cin >> l >> r >> x;
			modify_mod(l, r, x);
		} else if (opt == 3) {
			cin >> l >> x;
			modify_change(l, x);
		}
	}
	return 0;
}

RT,改了又改,但一直WA on #3 过不去。

2023/10/27 21:24
加载中...