【笔记】线段树学习笔记

线段树基础

单点修改:

#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;
}

线段树进阶

posted @ 2022-05-03 16:07  Daniel2020  阅读(23)  评论(0)    收藏  举报