分块满江红
  • 板块P2357 守墓人
  • 楼主zMinYu
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/5/27 18:14
  • 上次更新2024/5/27 21:07:26
查看原帖
分块满江红
882092
zMinYu楼主2024/5/27 18:14
#include <bits/stdc++.h> 
using namespace std;
const int N = 2e5 + 7, S = sqrt(N + 7);
int n, m, loc[N], bl, s, bg[S], ed[S], l, r, opt;
long long sum[S], a[N], add[S], k;
void modify(int l, int r, int k) {
	if (loc[l] != loc[r]) {
		for (int i = l; i <= ed[loc[l]]; i++) {
			a[i] += k;
			sum[loc[l]] += k; 
		}
//		add[loc[l]] += k;
		for (int i = bg[loc[r]]; i <= r; i++) {
			a[i] += k;
			sum[loc[r]] += k; 
		}
//		add[loc[r]] += k;
		for (int i = loc[l] + 1; i < loc[r]; i++) {
			sum[i] += k * (ed[i] - bg[i] + 1);
			add[i] += k;
		}
	} else {
//		add[loc[l]] += k;
		for (int i = l; i <= r; i++) {
			a[i] += k;
			sum[loc[l]] += k; 
		}
	}
	return;
}
long long query(int l, int r) {
	long long ret = 0;
	if (loc[l] != loc[r]) {
		for (int i = l; i <= ed[loc[l]]; i++) ret += a[i] + add[loc[l]];
		for (int i = bg[loc[r]]; i <= r; i++) ret += a[i] + add[loc[r]];
		for (int i = loc[l] + 1; i < loc[r]; i++) ret += sum[i];
	} else {
		for (int i = l; i <= r; i++) ret += a[i] + add[loc[l]];
	}
	return ret;
}
int main() {
	cin >> n >> m;
	bl = sqrt(n);
	s = ceil(1.00 * n / bl);
	for (int i = 1; i <= n; i++) {
		cin >> a[N];
		loc[i] = ceil(1.00 * i / bl);
	} 
	for (int i = 1; i <= s; i++) {
		bg[i] = (i - 1) * bl + 1;
		ed[i] = i * bl;
	}  
	ed[s] = n;
	for (int i = 1; i <= s; i++) {
		for (int j = bg[i]; j <= ed[i]; j++) {
			sum[i] += a[j];
		}
	}
	while (m--) {
		cin >> opt;
		if (opt == 1) {
			cin >> l >> r >> k;
			modify(l, r, k);
		} else if (opt == 2) {
			cin >> k;
			modify(1, 1, k);
		} else if (opt == 3) {
			cin >> k;
			modify(1, 1, -k);
		} else if (opt == 4) {
			cin >> l >> r;
			cout << query(l, r) << '\n';
		} else if (opt == 5) {
			cout << query(1, 1) << '\n';
		} 
//		for (int i = 1; i <= n; i++) cout << query(i, i) << ' ';
//		puts("");
	}
	return 0;
}

评测记录

不知道为什么,评测姬全都说 read 0。

2024/5/27 18:14
加载中...