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