1 条题解
-
0
首发题解😋
分块可以平衡查询和操作的时间复杂度
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0), cin.tie(0); int n; cin >> n; vector<int> a(n); for (auto &i : a) { cin >> i; } int block_size = sqrt(n); int block_count = (n + block_size - 1) / block_size; vector<int> lazy(block_count); for (int i = 0; i < n; ++i) { int opt, l, r, c; cin >> opt >> l >> r >> c; l--; r--; if (opt == 0) { // 区间[l, r]加上c int l_block = l / block_size; int r_block = r / block_size; if (l_block == r_block) { // 同一区块内,直接暴力更新 for (int j = l; j <= r; ++j) { a[j] += c; } } else { // 处理左半部分 for (int j = l; j < (l_block + 1) * block_size; ++j) { a[j] += c; } // 处理中间完整的块 for (int b = l_block + 1; b < r_block; ++b) { lazy[b] += c; } // 处理右半部分 for (int j = r_block * block_size; j <= r; ++j) { a[j] += c; } } } else { int b = r / block_size; cout << a[r] + lazy[b] << '\n'; } } return 0; }
- 1
信息
- ID
- 530
- 时间
- 100ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 15
- 已通过
- 2
- 上传者