1 条题解
-
0
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 5e4 + 10, sqrtN = 250; int n, a[N], b[N], c[N], L[sqrtN], R[sqrtN], tag[sqrtN]; signed main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; c[i] = a[i]; } int B = sqrt(n), cnt = (n + B - 1) / B; for (int i = 1; i <= n; i++) b[i] = (i - 1) / B + 1; for (int i = 1; i <= cnt; i++) { L[i] = (i - 1) * B + 1; R[i] = min(i * B, n); sort(c + L[i], c + R[i] + 1); } memset(tag, 0, sizeof(tag)); for (int i = 1; i <= n; i++) { int op, l, r, v; cin >> op >> l >> r >> v; if (op == 0) { if (b[l] == b[r]) { for (int i = l; i <= r; i++) a[i] += v; for (int i = L[b[l]]; i <= R[b[l]]; i++) c[i] = a[i]; sort(c + L[b[l]], c + R[b[l]] + 1); } else { for (int i = l; i <= R[b[l]]; i++) a[i] += v; for (int i = L[b[l]]; i <= R[b[l]]; i++) c[i] = a[i]; sort(c + L[b[l]], c + R[b[l]] + 1); for (int i = b[l] + 1; i <= b[r] - 1; i++) tag[i] += v; for (int i = L[b[r]]; i <= r; i++) a[i] += v; for (int i = L[b[r]]; i <= R[b[r]]; i++) c[i] = a[i]; sort(c + L[b[r]], c + R[b[r]] + 1); } } else { int ans = 0; if (b[l] == b[r]) { for (int i = l; i <= r; i++) { ans += (v * v > (a[i] + tag[b[l]])); } } else { // l ~ R[b[l]] 查询 < v * v - tag[b[l]] for (int i = l; i <= R[b[l]]; i++) { ans += (v * v > (a[i] + tag[b[l]])); } // b[l] + 1 ~ b[r] - 1 这些块内的答案 for (int i = b[l] + 1; i <= b[r] - 1; i++) { ans += lower_bound(c + L[i], c + R[i] + 1, v * v - tag[i]) - (c + L[i]); } // L[b[r]] ~ r 查询 < v * v - tag[b[r]] for (int i = L[b[r]]; i <= r; i++) { ans += (v * v > (a[i] + tag[b[r]])); } } cout << ans << '\n'; } } return 0; }
- 1
信息
- ID
- 470
- 时间
- 500ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 62
- 已通过
- 14
- 上传者