写一个板子。

 #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/区间更新的更多相关文章

  1. 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 ...

  2. 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  3. poj3468树状数组的区间更新,区间求和

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 47174   ...

  4. hdu-1754 I Hate It【线段树】(求区间最大值)

    <题目链接> I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  5. kb-07线段树-12--二分查找区间边界

    /* hdu4614 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边界就好办了: 这 ...

  6. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  7. 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 ...

  8. hdu 1166 线段树(sum+单点修改)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)

    题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...

随机推荐

  1. Linux通配符应用详解

    一.强大的“*” “*”在通配符中是最常用的一种,代表0个.一个或多个字符.在使用中有三种情况,表示三种不同的含义. 1.单独的“*” 这里指的是只有“*”出现的情况,默认为单独的一个,当然连续敲两个 ...

  2. 解决Geoserver请求跨域的几种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景描述 跨域问题是浏览器同源安全制引起的特别常见的问题.不同前端语 ...

  3. nginx预防常见攻击

    目录 nginx防止DDOS攻击 概述 攻击手段 配置 限制请求率 限制连接的数量 关闭慢连接 设置 IP 黑名单 设置IP白名单 小站点解决方案 nginx防止CC攻击 概述 主动抑制方法 应用举例 ...

  4. SQL Server中将多行数据拼接为一行数据(一个字符串)

    表A中id与表B中aid为一对多的关系 例如: 表A: id name a1 tom a2 lily a3 lucy 表B: id aid value b1 a1 B1 b2 a1 B2 b3 a2 ...

  5. java中的重写与重载

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...

  6. Webdriver之API详解(2)

    前言:今天继续上一篇文章https://www.cnblogs.com/linuxchao/p/linuxchao-selenium-apione.html分享selenium' webdriver ...

  7. SpringCloud微服务Zuul跨域问题

    目前项目结构是VUE做前端,后端采用微服务架构,在开发时前端需要跨域请求数据,通过ZuulFilter配置解决了简单跨域请求需要.但当需要在请求的header中增加token信息时,出现了请求失败的情 ...

  8. Ecto中的changeset,schema,struct,map

    概要 schema changeset struct map 总结 概要 Ecto 中, 对数据库的操作中经常用到 4 个类型: schema changeset struct map 在 Ecto ...

  9. redux 简介

    概述 Redux 本身是个极其简单的状态管理框架, 它的简单体现在概念少, 流程明确. 但是, 正是因为简单, 使用上没有强制的约束, 所以如果用不好, 反而会让状态管理更加混乱. 我觉得, 用好 R ...

  10. Jsp的基本知识

    jsp页面的基本组成部分:指令,表达式,小脚本,声明,注释,静态内容. 指令元素有三种: 1.page:eg <%@ page 属性名="属性值" 属性名="属性值 ...