线段树

先放一个模板吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#define mid  ((l + r) >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1
#define tag tree[rt].lazy
using namespace std;
typedef long long ll;
const int N = 4e5 + 10;
struct Tree {
	int l, r;
	ll value, lazy;
}tree[N];
void push_down(int rt) {
	if(tag) {
		tree[ls].value += tag * (tree[ls].r - tree[ls].l + 1);
		tree[rs].value += tag * (tree[rs].r - tree[rs].l + 1);
		tree[ls].lazy += tag; 
		tree[rs].lazy += tag;
		tag = 0;
	}
}
void build(int rt, int l, int r) {
	tree[rt].l = l;
	tree[rt].r = r;
	tree[rt].lazy = 0;
	if(l == r) {
		scanf("%lld", &tree[rt].value);
		return ;
	}
	build(lson);
	build(rson);
	tree[rt].value = tree[ls].value + tree[rs].value;
}
ll Query(int rt, int l, int r, int L, int R) {//区间查找。 
	if(l >= L && r <= R)
		return tree[rt].value;
	push_down(rt);
	ll a = 0, b = 0;
	if(L <= mid)	a = Query(lson, L, R);
	if(R > mid)	b = Query(rson, L, R);
	return a + b;
}
ll Query(int rt, int l, int r, int dis) {//单点查找。 
	return Query(rt, l, r, dis, dis);
}
void Update(int rt, int l, int r, int L, int R, ll k) {//区间跟新。 
	if(l >= L && r <= R) {
		tree[rt].value += k * (tree[rt].r - tree[rt].l + 1);
		tree[rt].lazy += k;
		return ;
	}
	push_down(rt);
	if(L <= mid)	Update(lson, L, R, k);
	if(R > mid)	Update(rson, L, R, k);
	tree[rt].value = tree[ls].value + tree[rs].value;
}
void Update(int rt, int l, int r, int dis, ll k) {//单点跟新。 
	Update(rt, l, r, dis, dis, k);
} 
void print(int rt, int l, int r) {//输出所有的叶子的值。 
	if(l == r) {
		printf("%lld ", tree[rt].value);
		return ;
	}
	print(lson);
	print(rson);
}
int main() {
	
	return 0;
}

posted @ 2020-03-12 17:05  lifehappy  阅读(145)  评论(0)    收藏  举报