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; }
정보
- ID
- 530
- 시간
- 100ms
- 메모리
- 256MiB
- 난이도
- 9
- 태그
- (N/A)
- 제출 기록
- 16
- 맞았습니다.
- 2
- 아이디