线段树-sum/max/min/区间更新
写一个板子。
#include <cstdio>
#include <algorithm> using namespace std; const int maxn = +; #define ROOT 1, 1, N
#define lson(x) (x<<1)
#define rson(x) (x<<1|1) struct SegmentTree{
int l, r;
int ma, mi, sum;
int lazy;
int lazy_ma, lazy_mi;
}st[maxn << ]; int val[maxn],N; void push_up(int x){
st[x].sum = st[lson(x)].sum + st[rson(x)].sum;
st[x].ma = max(st[lson(x)].ma, st[rson(x)].ma);
st[x].mi = min(st[lson(x)].mi, st[rson(x)].mi);
} void push_down(int x, int m){
if(st[x].lazy){
st[lson(x)].sum += (m-(m>>)) * st[x].lazy;
st[rson(x)].sum += (m>>) * st[x].lazy;
st[lson(x)].ma += st[x].lazy; st[lson(x)].mi += st[x].lazy;
st[rson(x)].ma += st[x].lazy; st[rson(x)].mi += st[x].lazy; st[lson(x)].lazy += st[x].lazy;
st[rson(x)].lazy += st[x].lazy; st[x].lazy = ;
}
} void build(int x, int l, int r){
st[x].l = l;st[x].r = r;
st[x].lazy = st[x].lazy_mi = st[x].lazy_ma = ; if(l == r){
st[x].sum = val[l];
st[x].ma = st[x].mi = val[l];
return ;
}
int mid = (l+r)>>;
build(lson(x), l, mid);
build(rson(x), mid+, r);
push_up(x);
} void update(int L, int R, int c, int x,int l,int r){
if(L <= l && R >= r){
st[x].sum += c * (r-l+);
st[x].ma += c;
st[x].mi += c;
st[x].lazy += c;
return ;
}
push_down(x, r-l+); int mid = (l+r)>>;
if(L <= mid) update(L, R, c, lson(x), l, mid);
if(R > mid) update(L, R, c, rson(x), mid+, r);
push_up(x);
} int query_sum(int L, int R, int x, int l, int r){
if(L <= l && R >= r){
return st[x].sum;
}
push_down(x, r-l+); int mid = (l+r)>>, res = ;
if(R <= mid) res = query_sum(L, R, lson(x), l, mid);
else if(L > mid) res = query_sum(L, R, rson(x), mid+, r);
else res = query_sum(L, R, lson(x), l, mid) + query_sum(L, R, rson(x), mid+, r);
push_up(x);
return res;
} int query_max(int L,int R, int x, int l, int r){
if(L <= l && R >= r){
return st[x].ma;
}
push_down(x, r-l+); int mid = (l+r)>>, res = ;
if(R <= mid) res = query_max(L, R, lson(x), l, mid);
else if(L > mid) res = query_max(L, R, rson(x), mid+, r);
else res = max(query_max(L, R, lson(x), l, mid), query_max(L, R, rson(x), mid+, r));
push_up(x);
return res;
} int query_min(int L,int R, int x, int l, int r){
if(L <= l && R >= r){
return st[x].mi;
}
push_down(x, r-l+); int mid = (l+r)>>, res = ;
if(R <= mid) res = query_min(L, R, lson(x), l, mid);
else if(L > mid) res = query_min(L, R, rson(x), mid+, r);
else res = min(query_min(L, R, lson(x), l, mid), query_min(L, R, rson(x), mid+, r));
push_up(x);
return res;
} int T,M; int main(){
scanf("%d", &T);
while(T--){
scanf("%d %d\n", &N, &M);
for(int i=;i<=N;i++) scanf("%d", &val[i]);
build(ROOT); for(int i=;i<M;i++){
char op[];
int l, r, c;
scanf("%s", op);
if(op[] == 'Q' && op[] == 'S'){
scanf("%d %d", &l, &r);
printf("%d\n", query_sum(l, r, ROOT));
}else if(op[] == 'Q' && op[] == 'A'){
scanf("%d %d", &l, &r);
printf("%d\n", query_max(l, r, ROOT));
}else if(op[] == 'Q' && op[] == 'I'){
scanf("%d %d", &l, &r);
printf("%d\n", query_min(l, r, ROOT));
}else if(op[] == 'I'){
scanf("%d %d %d", &l, &r, &c);
update(l, r, c, ROOT);
}
}
}
}
线段树-sum/max/min/区间更新的更多相关文章
- HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新
目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...
- poj3468树状数组的区间更新,区间求和
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 47174 ...
- hdu-1754 I Hate It【线段树】(求区间最大值)
<题目链接> I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- kb-07线段树-12--二分查找区间边界
/* hdu4614 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边界就好办了: 这 ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化
1组函数 avg(),sum(),max(),min(),count()案例: selectavg(sal),sum(sal),max(sal),min(sal),count(sal) from ...
- hdu 1166 线段树(sum+单点修改)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
随机推荐
- 展开隐形的翅膀,WPR003N补完篇
在上一回合要搞刷机!从它的尸体上踏过去!钢板云路由!WPR003N复活!成功启动OPENWRT中,笔者成功的让一个4年前主流芯片搭上OS的快船,留下一段佳话. 今天看着抽屉里的WPR003N,回忆它之 ...
- 使用C# 操作存储过程,执行sql语句通用类
如何使用C# 操作存储过程,执行sql语句? 闲话不多说,直接上代码: /// <summary> /// Sql通用类 /// </summary> ...
- React-组件的生命周期详解(含React16版本)
在一个组件的整个生命周期中,通过用户的交互来更新state或者props,重新渲染组件,更新页面的ui.组成一个简单的"状态机". react的生命周期三个阶段: Mounting ...
- MongoDB学习(操作集合中的文档)
文档概念 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 insert()方法 ...
- 基于Xamarin Android实现的简单的浏览器
最近做了一个Android浏览器,当然功能比较简单,主要实现了自己想要的一些功能……现在有好多浏览器为什么还要自己写?当你使用的时候总有那么一些地方不如意,于是就想自己写一个. 开发环境:Xamari ...
- 常见的网页图像格式有 ico、jpg、png、gif,说说他们各自的应用场景
1.ico:一般作为网页的标题上面的图标出现,文件 favicon.ico一般存放在网站根目录 2.jpg:非常适合作为储存像素色彩丰富的图片.例如照片等等 3.png:分为 png-8 以及 png ...
- JMeter 接口测试-if控制器
JMeter 接口测试-if控制器 使用场景: 当业务场景是用户登录才能支付操作, 不登录点击支付, 页面会跳转到登录页面. 对于接口也是这样, 一个接口需要执行前, 需要有前提条件, 比如0状态 ...
- Python正则表达式很难?一篇文章搞定他,不是我吹!
1. 正则表达式语法 1.1 字符与字符类 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必须使用进行转义 2 字符类 1. 包含在[]中的一个或者多个字符被称为字符类,字符类在匹配时 ...
- winserver-查看登陆日志
Abstract 先要开启登陆审核,在查看登陆日志. 开启审核 运行 secpol.msc 日志查看 windowslog 下的security 管理员成功登陆后的eventid:4776,4648, ...
- Oracle 安装步骤、安装中错误处理、完整卸载
/*************************************************以下ORACLE服务端安装************************************* ...