社区讨论

0pts,部分 WA 求条

P13977数列分块入门 2参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlhidk08
此快照首次捕获于
2026/02/11 12:07
4 周前
此快照最后确认于
2026/02/11 14:04
4 周前
查看原帖
CodeCPP
#include <bits/stdc++.h>
#define int long long
using namespace std;

bool ST;

const int N = 2e5 + 5;
int n, len, bel[N], ll[N], rr[N];
long long a[N], A[N], sum[N];
void rebuild (int x) {
	int l = ll[x], r = rr[x];
	for (int i = l; i <= r; ++i) a[i] = A[i];
	sort (a + l, a + r + 1);
} 

bool ED;

signed main () {

	ios::sync_with_stdio (false);
	cin.tie (0); cout.tie (0);
	
	cerr << "[Memory] " << (&ST - &ED) / 1024 / 1024 << " MB\n";

//  freopen (".in", "r", stdin);
//  freopen (".out", "w", stdout);

	cin >> n;
	len = sqrt (n);
	for (int i = 1; i <= n; ++i) { cin >> a[i]; A[i] = a[i]; } 
	for (int i = 1; i <= n; ++i) bel[i] = (i - 1) / len + 1;
	int tmp = n / len;
	for (int i = 1; i <= tmp; ++i) ll[i] = (i - 1) * len + 1, rr[i] = i * len;
	if (tmp * len < n) ll[tmp + 1] = tmp * len + 1, rr[tmp + 1] = n, tmp++;
	for (int i = 1; i <= tmp; ++i) rebuild (i);
	
	for (int q = 1; q <= n; ++q) {
		int opt, l, r, c;
		cin >> opt >> l >> r >> c;
		if (opt == 0) {
			int L = bel[l], R = bel[r];
			if (L == R) {
				for (int i = l; i <= r; ++i) A[i] += c;
				rebuild (L);
			}
			else {
				for (int i = L + 1; i <= R - 1; ++i) sum[i] += c;
				for (int i = l; i <= rr[L]; ++i) A[i] += c;
				for (int i = ll[R]; i <= r; ++i) A[i] += c;
				rebuild (L);
				rebuild (R);
			}
		} else {
			int L = bel[l], R = bel[r], ans = 0;
			if (L == R) { for (int i = l; i <= r; ++i) if (A[i] + sum[L] < c * c) ans++; }
			else {
				for (int i = L + 1; i <= R - 1; ++i) {
					int x = 0, y = len, ret = 0;
					while (x <= y) {
						int mid = x + ((y - x) >> 1);
						if (a[ll[i] + mid - 1] + sum[i] < c * c) {
							ret = mid;
							x = mid + 1;
						} else y = mid - 1;
					}
					ans += ret;
				}
				for (int i = l; i <= rr[L]; ++i) ans += (A[i] + sum[L] < c * c);
				for (int i = ll[R]; i <= r; ++i) ans += (A[i] + sum[R] < c * c);
			}
			cout << ans << '\n';
		}
	}

	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...