机缘
- 实战项目中的经验分享
- 日常学习过程中的记录
- 通过文章进行技术交流
收获
- 获得了 99 99 99 粉丝的关注
- 获得了大量正向的反馈,如赞、评论、阅读量等
日常
创作已经是你生活的一部分了
成就
#include <bits/stdc++.h>
using lint = long long;
struct TreeNode {
lint w, lzy;
size_t l, r;
std::shared_ptr<TreeNode> lson, rson;
TreeNode() {
w = lzy = 0;
l = r = -1;
lson = rson = nullptr;
}
TreeNode(size_t _l, size_t _r) {
w = lzy = 0;
l = _l, r = _r;
lson = rson = nullptr;
}
};
bool inRange(int l, int r, int L, int R) {
return l >= L && r <= R;
}
bool outRange(int l, int r, int L, int R) {
return l > R || r < L;
}
void pushup(std::shared_ptr<TreeNode> &u) {
u->w = u->lson->w + u->rson->w;
}
void maketag(std::shared_ptr<TreeNode> &u, lint delta) {
u->lzy += delta;
u->w += delta * (u->r - u->l + 1);
}
void pushdown(std::shared_ptr<TreeNode> &u) {
size_t mid = u->l + u->r >> 1;
if (!u->lson) u->lson = std::shared_ptr<TreeNode>(new TreeNode(u->l, mid));
if (!u->rson) u->rson = std::shared_ptr<TreeNode>(new TreeNode(mid + 1, u->r));
maketag(u->lson, u->lzy), maketag(u->rson, u->lzy);
u->lzy = 0;
}
lint query(std::shared_ptr<TreeNode> &u, int L, int R) {
if (outRange(u->l, u->r, L, R)) return 0;
if (inRange(u->l, u->r, L, R)) return u->w;
pushdown(u);
size_t mid = u->l + u->r >> 1;
return query(u->lson, L, R) + query(u->rson, L, R);
}
void update(std::shared_ptr<TreeNode> &u, int L, int R, lint delta) {
if (outRange(u->l, u->r, L, R)) return ;
if (inRange(u->l, u->r, L, R)) {
maketag(u, delta);
return ;
}
pushdown(u);
size_t mid = u->l + u->r >> 1;
update(u->lson, L, R, delta);
update(u->rson, L, R, delta);
pushup(u);
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int n, m; std::cin >> n >> m;
std::shared_ptr<TreeNode> root(new TreeNode(1, n));
for (int i = 1, a; i <= n; ++i) {
std::cin >> a;
update(root, i, i, a);
}
for (int op, x, y, k; m; --m) {
std::cin >> op >> x >> y;
if (op == 1) std::cin >> k, update(root, x, y, k);
else std::cout << query(root, x, y) << '\n';
}
std::cout.flush();
return 0;
}
憧憬
在 2025 年中,AK CSP-J,CSP-S 300+,参加 NOIP
Tips