博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最全基础区间线段树模板
阅读量:6579 次
发布时间:2019-06-24

本文共 2704 字,大约阅读时间需要 9 分钟。

最全基础区间线段树模板

以下这个板子稍微理解以下完全可以盲敲,

维护包括了最值,区间和(当然 能区间分治的信息都能维护,比如集合之类的)
更新包括了区间替换和区间加减 两种。

暂时只测试了最大值,如果有错欢迎留言。

/*既要维护Min,又要维护区间替换的值,又要查询一个点的值的话。要加一个V数组,if add[rt]==V[rt] 说明标记没有下推,这个区间的值都是V[rt],所以Min[rt]=V[rt]等else 说明这个区间的值不完全一样,需要继续下推标记。直到l==r。更新 上推还是照样上推*/#include 
#define rep(i,l,r) for(int i=l;i
=l;i--)#define lc rt<<1#define lson l,m,rt<<1#define rc rt<<1|1#define rson m+1,r,rt<<1|1#define mp make_pair#define pb push_back#define all(x) x.begin(),x.end()using namespace std;typedef long long ll;typedef pair
pii;const int INF=0x3f3f3f3f;using namespace std;int n,m,k;const int N=1e5+10;int A[N];//线段树struct segT{
static const int segN=1e5+10; int Max[segN<<2];//Max[segN<<2],Sum[segN<<2],V[segN<<2];//min,max,sum,val int add[segN<<2]; void pushup(int rt){
Max[rt]=max(Max[lc],Max[rc]); } void build(int l,int r,int rt){
add[rt]=0; if(l==r){
Max[rt]=A[l]; return; } int m=(l+r)>>1; build(lson); build(rson); pushup(rt); } /************* *区间替换用=v,区间更新用+=v *add,Max,Max(+)=v *Sum[lc](+)=(m-l+1)*v *Sum[rc](+)=(r-m)*v *******************/ //void pushdown(int l,int r,int rt){
void pushdown(int rt){
//int m=(l+r)>>1; if(add[rt]){
int v=add[rt]; add[rt]=0; Max[lc]+=v; Max[rc]+=v; add[lc]+=v; add[rc]+=v; } } void update(int L,int R,int v,int l,int r,int rt){
if(L<=l&&r<=R){
Max[rt]+=v; add[rt]+=v; return; } pushdown(rt); int m=(l+r)>>1; if(L<=m)update(L,R,v,lson); if(m+1<=R)update(L,R,v,rson); pushup(rt); } //如果要返回的参数不止一个,就改成void 在第一个if中更新信息, //然后return,比如还要记录最大值的下标 int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return Max[rt]; } pushdown(rt); int m=(l+r)>>1; int ret=-INF; if(L<=m)ret=max(ret,query(L,R,lson)); if(m+1<=R)ret=max(ret,query(L,R,rson)); return ret; }};segT seg1;int main(){
//freopen("in.txt","r",stdin); int A[N]; int n,m,x,y,v,op; while(~scanf("%d",&n)){
for(int i=1;i<=n;i++) scanf("%d",&A[i]); seg1.build(1,n,1); while(scanf("%d",&op)){
if(op==1){
scanf("%d%d%d",&x,&y,&v); seg1.update(x,y,v,1,n,1); } else if(op==2){
scanf("%d%d",&x,&y); cout<
<

转载于:https://www.cnblogs.com/alonglyn/p/9953944.html

你可能感兴趣的文章
socket 编程入门教程(五)UDP原理:4、“有连接”的UDP
查看>>
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划
查看>>
SpringBoot实战总汇--详解
查看>>
2018年7月1日笔记
查看>>
尝试使用iReport4.7(基于Ubuntu Desktop 12.04 LTS)
查看>>
动态规划:金矿模型
查看>>
子元素应该margin-top为何会影响父元素【转】
查看>>
AJAX 状态值(readyState)与状态码(status)详解
查看>>
BZOJ3668:[NOI2014]起床困难综合症(贪心)
查看>>
LightOJ 1245(Harmonic Number (II))
查看>>
小知识记录
查看>>
css3 animate 和关键帧 @-webkit-keyframes
查看>>
文字链接颜色设置
查看>>
图片转流
查看>>
ubunto应用软件
查看>>
HTML 标签说明
查看>>