#include <bits/stdc++.h>
using namespace std;
struct node {
int l, r;
int value;
int lazy = 0;
}tree[4*10];
void build_tree(int l,int r,int u) {
tree[u].l = l;
tree[u].r = r;
if (l == r) {
tree[u].value = l;
return;
}
build_tree(l, (l + r) >> 1, u << 1);
build_tree(((l + r) >> 1)+1,r, (u << 1)+1);
tree[u].value = tree[u << 1].value + tree[(u << 1) + 1].value;
}
//测试
void dfs(int u) {
if (tree[u].l == tree[u].r)
{
cout << tree[u].value << endl;
return;
}
dfs(u << 1);
dfs((u << 1) + 1);
}
//add的lazy标志 表示下放lazy表示 代表区间每个结点需要加几
void pushup(int u) {
tree[u].value = tree[u << 1].value + tree[(u << 1) + 1].value;
}
void pushdown(int u) {
if (tree[u].lazy != 0) {
tree[u << 1].lazy += tree[u].lazy;
tree[(u << 1) + 1].lazy += tree[u].lazy;
tree[u << 1].value += (tree[u << 1].r - tree[u << 1].l + 1) * tree[u].lazy;
tree[(u << 1) + 1].value += (tree[(u << 1) + 1].r - tree[(u << 1) + 1].l + 1) * tree[u].lazy;
tree[u].lazy = 0;
}
}
void add(int l,int r,int u, int c) {
//完全包含
if (l<=tree[u].l&&r>=tree[u].r) {
tree[u].value += (tree[u].r - tree[u].l + 1) * c;
tree[u].lazy += c;
return;
}
//表示更新的这条链需要及时更新值
pushdown(u);
int mid = (tree[u].l + tree[u].r) >> 1;
if (l <= mid) add(l, r,u<<1, c);
if (r > mid) add(l, r, (u<<1)+1,c);
pushup(u);//向上更新 一直更新到根节点
}
long long query(int l, int r, int u) {
//完全包含
if (l <= tree[u].l && r >= tree[u].r) {
return tree[u].value;
}
//表示查询的这条链需要及时更新值
pushdown(u);
int mid = (tree[u].l + tree[u].r) >> 1;
long long ans = 0;
if (l <= mid) ans+=query(l, r, u << 1);
if (r > mid) ans+=(l, r, (u << 1) + 1);
return ans;
}
int main()
{
build_tree(1, 10, 1);
add(1, 3, 1,1);
cout << query(1, 3, 1);
}
线段树模板-适合小白版
于 2024-08-08 22:24:17 首次发布