Duan2baka的线段树模板!
区间加(Add_Seq),区间修改(Modify_Seq),区间求和(Query),区间最大值(Query_MAX),单点加(Add),单点修改(Modify)
有待补充…
#include<algorithm>
#include<ctype.h>
#include<cstdio>
#define N 100050
using namespace std;
inline int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)) x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
int a[N];
struct Seg{int l,r,sum,lazy,maxx,add;Seg *ls,*rs;
}root;
inline void Update(Seg *k){if(k->ls==NULL) return;k->sum=k->ls->sum+k->rs->sum;k->maxx=max(k->ls->maxx,k->rs->maxx);
}
inline void Pushdown_MOD(Seg *k){if(k->lazy==-1) return;if(k->ls!=NULL){k->ls->lazy=k->lazy;k->ls->maxx=k->lazy;k->ls->sum=(k->ls->r-k->ls->l+1)*k->lazy;}if(k->rs!=NULL){k->rs->lazy=k->lazy;k->rs->maxx=k->lazy;k->rs->sum=(k->rs->r-k->rs->l+1)*k->lazy;}k->lazy=-1;
}
inline void Pushdown_Add(Seg *k){if(k->add==0) return;if(k->ls!=NULL){k->ls->add+=k->add;k->ls->maxx+=k->add;k->ls->sum+=(k->ls->r-k->ls->l+1)*k->add;}if(k->rs!=NULL){k->rs->add+=k->add;k->rs->maxx+=k->add;k->rs->sum+=(k->rs->r-k->rs->l+1)*k->add;}k->add=0;
}
inline void Pushdown(Seg *k){Pushdown_MOD(k);Pushdown_Add(k);
}
void maketree(int l,int r,Seg *k){k->l=l;k->r=r;k->add=0;if(l==r){k->sum=0;k->maxx=0;return;}int mid=l+r>>1;k->ls=new(Seg);k->rs=new(Seg);maketree(l,mid,k->ls);maketree(mid+1,r,k->rs);Update(k);
}
void remake(Seg *k){k->lazy=-1;k->add=0;if(k->l==k->r){k->sum=k->maxx=a[k->l];return;}remake(k->ls);remake(k->rs);Update(k);
}
void Delete(Seg *k){if(k->ls!=NULL){Delete(k->ls);}if(k->rs!=NULL){Delete(k->rs);}delete(k);
}
void Add(int x,int v,Seg *k){if(k->l==k->r){k->sum+=v;return;}int mid=(k->l+k->r)>>1;if(x<=mid) Add(x,v,k->ls);else Add(x,v,k->rs);Update(k);
}
int Query(int x,int y,Seg *k){if(x<=k->l && y>=k->r){return k->sum;}int mid=(k->l+k->r)>>1,t;Pushdown(k);Update(k);if(y<=mid) t=Query(x,y,k->ls);else if(x>mid) t=Query(x,y,k->rs);else t=Query(x,y,k->ls)+Query(x,y,k->rs);Pushdown(k);Update(k);return t;
}
int Query_MAX(int x,int y,Seg *k){if(x<=k->l && y>=k->r){return k->maxx;}Pushdown(k);int mid=(k->l+k->r)>>1;if(y<=mid) return Query_MAX(x,y,k->ls);if(x>mid) return Query_MAX(x,y,k->rs);return max(Query_MAX(x,y,k->ls),Query_MAX(x,y,k->rs));
}
void Modify(int x,int v,Seg *k){if(k->l==k->r){k->sum=v;k->maxx=v;return;}int mid=(k->l+k->r)>>1;if(x<=mid) Modify(x,v,k->ls);else Modify(x,v,k->rs);Update(k);
}
void Modify_Seq(int x,int y,int v,Seg *k){if(k->l>=x && k->r<=y){k->lazy=v;k->maxx=v;k->sum=(k->r-k->l+1)*v;return;}Pushdown(k);int mid=(k->l+k->r)>>1;if(y<=mid) Modify_Seq(x,y,v,k->ls);else if(x>mid) Modify_Seq(x,y,v,k->rs);else Modify_Seq(x,y,v,k->ls),Modify_Seq(x,y,v,k->rs);Update(k);
}
void Add_Seq(int x,int y,int v,Seg *k){if(k->l>=x && k->r<=y){k->add=k->add+v;k->maxx=k->maxx+v;k->sum=k->sum+(k->r-k->l+1)*v;return;}Pushdown(k);Update(k);int mid=(k->l+k->r)>>1;if(y<=mid) Add_Seq(x,y,v,k->ls);else if(x>mid) Add_Seq(x,y,v,k->rs);else Add_Seq(x,y,v,k->ls),Add_Seq(x,y,v,k->rs);Pushdown(k);Update(k);
}
main(){
return 0;
}
Duan2baka的线段树模板!相关推荐
- hdu1156(简单线段树 模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 线段树模板hdu 1754:I Hate It
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- 【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)
problem 给定一个长为n的序列,m次询问 每次询问有3种操作 1.一段区间全部乘一个值 2.一段区间全部加一个值 3.询问一段区间和%P solution 不就一颗线段树么,看朕10分钟A掉.. ...
- 洛谷3373 线段树模板
题目详情:https://www.luogu.org/problemnew/show/P3373 这个线段树模板写的头疼(最后纠错发现一个long long没开差点一口血喷出来),思路就是在普通的求区 ...
- ccf除法-线段树模板
这题的要求是对区间处理,查询区间和,一看就是线段树模板题,下面是代码 #include<iostream> using namespace std; int pp[100001]; str ...
- 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题
题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...
- 线段树模板题3:区间染色问题
1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...
- Just a Hook(线段树模板)
题意 n个铜棒子,对其进行区间修改,将区间中的棒子价值增加,问最后所有棒子的总价值是多少. 铜棒:1 银棒:2 金棒:3 思路 线段树模板题 建树时,每个节点值都为1,对其进行区间修改 最后输出根节点 ...
最新文章
- java 图像膨胀与腐蚀程序_膨胀和腐蚀 - 解决图像缺陷问题
- 深度学习训练中关于数据处理方式--原始样本采集以及数据增广
- iReport 5.添加修改删除jdbc
- 目标群体是什么意思_抖音代运营日常主要是做什么的?
- 自动化系统计算机网络期末考试题,模拟试卷_计算机网络试题B-自动化-孙璐
- (记录)操作多层Iframe嵌套内的元素
- Python 解析百度,搜狗词库
- Android反编译实战-去广告
- 基于vue开发一个组件库
- Centos7修改IP地址
- Linux 音频系统简析
- 易经- 第一卦 乾卦
- chatGPT 与文言一心的对比
- 3.6.2 找出分区的主副本
- python如何实现电子邮件的发送
- 图像修复序列——混合稀疏表示(Hybrid Sparse Representations)模型
- 程序员在家办公太无聊,推荐你看完这十部电影。收货满满
- 【高考那些事】准大学生看过来,选择方向和未来,自己把握
- 【QGIS入门实战精品教程】5.2:QGIS自定义坐标系案例教程
- 带你重新认识一个不太正经的HTML