社区讨论
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 条回复,欢迎继续交流。
正在加载回复...