线段树-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 ...
随机推荐
- golang实现aes-cbc-256加密解密过程记录
我为什么吃撑了要实现go的aes-cbc-256加密解密功能? 之前的项目是用php实现的,现在准备用go重构,需要用到这个功能,这么常用的功能上网一搜一大把现成例子,于是基于go现有api分分钟实现 ...
- Form 表单提交的几种方式
简单的总结一下form表单提交的几种方式:1.最简单的方式 就用form的submit提交方式,这种提交方式是不需要回调函数的 这种方式最近到一个form提供action路径后台接受就可以< ...
- 【Oracle学习笔记】定时任务(dbms_job)
一.概述 Oralce中的任务有2种:Job和Dbms_job,两者的区别有: 1. jobs是oracle数据库的对象, dbms_jobs只是jobs对象的一个实例, 就像对于tables, e ...
- bootstrap实现表格
基本实例样式 效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- Oracle字符到数值转换错误
[错误] [问题分析] line 3: 定义 NUM_VAL varchar2(500); line 9: NUM_VAL := 'NUM'+1; NUM_VAL是一个varchar类型的数据,而在数 ...
- 高通方案的Android设备几种开机模式的进入与退出
高通方案的Android设备主要有以下几种开机模式,Android.EDL.Fastboot.Recovery和FFBM,其进入及退出的方式如下表. 开机模式 屏幕显示 冷启动 热启动 按键退出 命令 ...
- ocelot 自定义认证和授权
ocelot 自定义认证和授权 Intro 最近又重新启动了网关项目,服务越来越多,每个服务都有一个地址,这无论是对于前端还是后端开发调试都是比较麻烦的,前端需要定义很多 baseUrl,而后端需要没 ...
- JS 字符串对象 数组对象 函数对象 函数作用域
一.内置对象 object对象:ECMAScript 中的所有对象都由这个对象继承而来:Object 对象中的所有属性和方法都会出现在其他对象中 ToString() : 返回对象的原始字符串表示.V ...
- 原 js实现数据持久化
在写js事件时,常常遇到点击一个事件,然后在若干时间以后需要知道最近一次点击的事件的结点.比如这里: 我点击树节点1,再点击tab2,然后我再来回切换tab,假如最后一次点击tab时在tab2上,这时 ...
- Java导出Excel的Springmvc实例
@RequestMapping(value = "downloadExcel", method = RequestMethod.GET) public String downl ...