【笔记】线段树学习笔记
线段树基础
单点修改:
#include<bits/stdc++.h>
using namespace std;
void modify(int x,int l,int r,int pos)
{
if(l == r) { /*modify*/ return; }
pushdown(x);
int mid = (l+r)>>1;
if(pos <= mid) modify(ls,l,mid,pos);
else modify(rs,mid+1,r,pos);
pushup(x);
return;
}
单点查询:
#include<bits/stdc++.h>
using namespace std;
int query(int x,int l,int r,int pos)
{
if(l == r) return t[x];
pushdown(x);
int mid = (l+r)>>1;
if(pos <= mid) return query(ls,l,mid,pos);
else return query(rs,mid+1,r,pos);
}
区间修改:
#include<bits/stdc++.h>
using namespace std;
void modify(int x,int l,int r,int L,int R)
{
if(L <= l && r <= R) { /*modify*/ return; }
pushdown(x);
int mid = (l+r)>>1;
if(L <= mid) modify(ls,l,mid,L,R);
if(mid < R) modify(rs,mid+1,r,L,R);
pushup(x);
return;
}
区间查询:
#include<bits/stdc++.h>
using namespace std;
int query(int x,int l,int r,int L,int R)
{
if(L <= l && r <= R) return t[x];
pushdown(x);
int mid = (l+r)>>1,ans = 0;
if(L <= mid) ans += query(ls,l,mid,L,R);
if(mid < R) ans += query(rs,mid+1,r,L,R);
return ans;
}

浙公网安备 33010602011771号