线段树-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 ...
随机推荐
- DSAPI官方QQ群
DSAPI官方QQ群 请加主群,若主群成员已满,请加分群. 群内除常规的.NET技术交流外,也负责DSAPI的使用技术支持和更新通知. 『VB.NET/C#编程』主群 ...
- spring的理解
看过<fate系列>的博友知道,这是一个七位英灵的圣杯争夺战争.今天主要来谈谈圣杯的容器概念,以便对spring的理解. 圣杯: 圣杯本身是没有实体的,而是将具有魔术回路的存在(人)作为“ ...
- 简简单单的Vue2(简单语法,生命周期,组件)
既然选择了远方,便只顾风雨兼程! __HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 简单入手 组件 在上面文章,我们简单的讲了前端框架的工程化,也就是MVVM,还有特别聊 ...
- powdesingner 更新数据库表结构
1.连接数据库 2更新数据库表结构
- 通用mapper认识和用法
目录 0. 认识 1. 导包 2. mybatis的config文件:mybatis-mapper-config.xml 3. spring与mybatis整合配置文件:mybatis.xml 4. ...
- 文本三剑客---awk(gawk)基础
gawk程序是Unix中原始awk程序的GNU版本.gawk程序让流编辑器迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令.在gawk编程语言中,可以完成下面的事情: (1)定义变量来保存数 ...
- js中console使用2
接着上一篇js中console使用1,本片继续介绍js中console的用法 测试代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...
- Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控
基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
- Android为TV端助力:自定义view之太阳
先看效果图 package com.hhzt.iptv.lvb_w8.view; import android.content.Context;import android.graphics.Canv ...
- Linux安装配置Mariadb
一.安装数据库Mariadb 参考:http://blog.51cto.com/12173069/2047746 从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! 使用系统自 ...