1 条题解
-
0
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 5e4 + 10,sqrtN = 250; // 区间加,单点查 // a[i]记录每个点的值,b[i]记录每个点i所在块; // 每个块i的左端点L[i]、右端点R[i], 块内标记tag[i] int n, a[N], b[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]; } int B = sqrt(n) ,cnt = (n+B-1)/B;// B为每块的长度,cnt为总块数 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); } memset(tag, 0, sizeof(tag)); for (int i = 1; i <= n; i++) { int op, l, r, c; cin >> op >> l >> r >> c; if (op == 0) { if (b[l] == b[r]) { // 如果l和r在同一块内 for (int i = l; i <= r; i++) a[i] += c; } else { for (int i = l; i <= R[b[l]]; i++) a[i] += c; for (int i = b[l] + 1; i <= b[r] - 1; i++) tag[i] += c; for (int i = L[b[r]]; i <= r; i++) a[i] += c; } } else cout << a[r] + tag[b[r]] << '\n'; } return 0; }
- 1
信息
- ID
- 469
- 时间
- 100ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 103
- 已通过
- 23
- 上传者