社区讨论

0pts求条(AC#1#10其余全WA)

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhj0mf1m
此快照首次捕获于
2025/11/03 18:46
4 个月前
此快照最后确认于
2025/11/03 18:46
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
using ll = long long;
const int Mod = 998244353, mod = 1e9 + 7, N = 5e5 + 10;
ll pos[N], a[N], add[N], be[N], ed[N];
int n, m, len;

void rebuild(int k) {
	sort(a + be[k], a + ed[k] + 1);
}

void change(int l, int r, ll x) {
	int p = pos[l], q = pos[r];
	if (p == q) {
		for (int i = l; i <= r; i++) a[i] += x;
		rebuild(p);
	}
	else {
		for (int i = l; i <= ed[p]; i++) a[i] += x;
		for (int i = p + 1; i <= q - 1; i++) add[i] += x;
		for (int i = be[q]; i <= r; i++) a[i] += x;
		rebuild(p), rebuild(q);
	}
}

ll query(int l, int r, ll c) {
	int p = pos[l], q = pos[r];
	ll ans = -1e16;
	if (p == q) {
		for (int i = l; i <= r; i++) {
			if (a[i] + add[p] < c) ans = max(ans, a[i] + add[p]);
		}
		return ans == -1e16 ? -1 : ans;
	}
	for (int i = l; i <= ed[p]; i++) {
		if (a[i] + add[p] < c) ans = max(ans, a[i] + add[p]);
	}
	for (int i = be[q]; i <= r; i++) {
		if (a[i] + add[q] < c) ans = max(ans, a[i] + add[q]);
	}
	for (int i = p + 1; i < q; i++) {
		ll x = lower_bound(a + be[i], a + ed[i] + 1, c - add[i]) - a - 1;
		if (x >= be[i]) ans = max(ans, a[x] + add[i]);
	}
	return ans == -1e16 ? -1 : ans;
}

signed main() {
	cin >> n;
	len = sqrt(n);
	for (int i = 1; i <= n; i++) {
		cin >> a[i], pos[i] = (i - 1) / len + 1;
		if (pos[i] != pos[i - 1]) ed[pos[i - 1]] = i - 1, be[pos[i]] = i;
	}
	int t = n / len + bool(n % len);
	ed[t] = n;
	for (int i = 1; i <= t; i++) rebuild(i);
	while(n--) {
		int l, r, op;
		ll k;
		cin >> op >> l >> r >> k;
		if (op & 1) cout << query(l, r, k) << endl;
		else change(l, r, k);
	}
	return 0;
}

回复

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

正在加载回复...