线段树-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 ...
随机推荐
- [JavaScript] requireJS基本使用
requireJS 是一个 AMD 规范的模块加载器主要解决的js开发的4个问题1. 异步加载,防止阻塞页面渲染2. 解决js文件之间的依赖关系和保证js的加载顺序3. 按需加载 来实现一个 requ ...
- 表单数据验证方法(一)—— 使用validate.js实现表单数据验证
摘要:使用validate.js在前端实现表单数据提交前的验证 好久没写博客了,真的是罪过,以后不能这样了,只学习不思考,学的都是白搭,希望在博客园能记录下自己学习的点滴,虽然记录的都是些浅显的技术, ...
- 《C#并发编程经典实例》学习笔记—2.5 等待任意一个任务完成 Task.WhenAny
问题 执行若干个任务,只需要对其中任意一个的完成进行响应.这主要用于:对一个操作进行多种独立的尝试,只要一个尝试完成,任务就算完成.例如,同时向多个 Web 服务询问股票价格,但是只关心第一个响应的. ...
- 从零开始学安全(四十六)●sqli-labs 1-4关 涉及的知识点
Less-1 到Less-4 基础知识注入 我们可以在 http://127.0.0.1/sqllib/Less-1/?id=1 后面直接添加一个 ‘ ,来看一下效果: 从上述错误当中,我们可以看到 ...
- WPF 水印TextBox WatermarkTextBox
//https://blog.csdn.net/puchitomato/article/details/12248691 转自以上链接,自己添加了Enter响应事件. public class ...
- 解决html代码文本复制问题,js技术
实例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <scr ...
- Linux常用查找命令
第一种:grep命令 示例: 第二种:find命令 示例: 第三种:locate命令 示例: 第四种:whereis命令 示例: 第五种:which命令 示例:
- odoo12 物流 自动计算运费 ,采购销售使用不同计量单位自动换算
在物流和食品生鲜类行业,重量是很重要的因素,不仅要处理产品的数量,也要处理产品的重量.在多数行业,重量也是订单的重要数据. odoo原生包含了对重量的处理,下文中将指导如何优雅应用odoo原生模块处理 ...
- 城市经纬度 json
[ { "name": "北京市", "log": "116.46", "lat": "3 ...
- 经度和纬度在SQL中的数据类型
冬天太冷,等坐公司班车也很冷,就萌生了给班车做一个到站查询功能. 在某宝上买了汽车在线的GPS设备, 终生免费的服务的. 这里不得不提下这个设备的优点, 它提供API接口,还是免费的. 所以在班车上装 ...