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]+=