分块 0 分求调
查看原帖
分块 0 分求调
763782
zbojin楼主2024/9/25 13:28
#include <stdio.h>

const int MAXN = 1e5 + 5;

int n, m, block, op, x, y, k, bx, by;
long long ret;
int belong[MAXN], beg[MAXN], end[MAXN];
long long a[MAXN], sum[MAXN], tag[MAXN];

int main(void) {
	scanf("%d %d", &n, &m);
	block = __builtin_sqrt(n);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", a + i);
		if (i % block == 1) {
			belong[i] = belong[i - 1] + 1;
			beg[belong[i]] = i;
		}
		else
			belong[i] = belong[i - 1];
		sum[belong[i]] += a[i];
		end[belong[i]] = i;
	}
	if (m) {
		do {
			scanf("%d %d %d", &op, &x, &y);
			bx = belong[x];
			by = belong[y];
			if (op == 1) {
				scanf("%d", &k);
				if (bx == by) {
					for (int i = x; i <= y; ++i)
						a[i] += k;
				}
				else {
					for (int i = bx + 1; i < by; ++i) {
						sum[i] += 1ll * k * (end[i] - beg[i] + 1);
						tag[i] += k;
					}
					for (int i = x; i <= end[bx]; ++i)
						a[i] += k;
					for (int i = y; i >= beg[by]; --i)
						a[i] += k;
				}
			}
			else {
				ret = 0;
				if (tag[bx]) {
					sum[bx] += 1ll * k * (end[bx] - beg[bx] + 1);
					for (int i = beg[bx]; i <= end[bx]; ++i)
						a[i] += tag[bx];
					tag[bx] = 0;
				}
				if (tag[by]) {
					sum[by] += 1ll * k * (end[by] - beg[by] + 1);
					for (int i = beg[by]; i <= end[by]; ++i)
						a[i] += tag[by];
					tag[by] = 0;
				}
				if (bx == by) {
					for (int i = x; i <= y; ++i)
						ret += a[i];
				}
				else {
					for (int i = bx + 1; i < by; ++i)
						ret += sum[i];
					for (int i = x; i <= end[bx]; ++i)
						ret += a[i];
					for (int i = y; i >= beg[by]; --i)
						ret += a[i];
				}
				printf("%lld\n", ret);
			}
		} while (--m);
	}
	return 0;
}

如标题所述,本萌新使用分块算法,全 WA。

请高人指点。

2024/9/25 13:28
加载中...