社区讨论
0pts,部分 WA 求条
P13977数列分块入门 2参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlhidk08
- 此快照首次捕获于
- 2026/02/11 12:07 4 周前
- 此快照最后确认于
- 2026/02/11 14:04 4 周前
Code
CPP#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 条回复,欢迎继续交流。
正在加载回复...