title : 线段树 date : 2021-8-15 tags : ACM,数据结构
线段树
线段树基础
首先上个板子来复习一下线段树的基本写法。
//基础板 P3372 【模板】线段树 1
#include<bits/stdc++.h>
using namespace std;
int n,m,l,r,k,q;
long long arr[100005],tree[270000],lazy[270000];
void build(int node,int l,int r){ //建树
if(l==r){
tree[node]=arr[l];
return;
}
int mid=(l+r)/2;
build(node*2,l,mid); //左区间建树
build(node*2+1,mid+1,r); //右区间建树
tree[node]=tree[node*2]+tree[node*2+1]; //区间和
}
void pushdown(int node,int start,int end){ //下传操作
int mid=(start+end)/2;
if(lazy[node]){
tree[node*2]+=lazy[node]*(mid-start+1); //更新区间和
tree[node*2+1]+=lazy[node]*(end-mid);
lazy[node*2]+=lazy[node]; //懒标记下传
lazy[node*2+1]+=lazy[node];
}
lazy[node]=0;
}
void update(int node,int start,int end,int l,int r,int c){ //更新操作
if(l<=start&&end<=r){ //如果区间在更新范围内,直接标记返回
tree[node]+=(end-start+1)*c; //区间和加上Len倍的c
lazy[node]+=