欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ3064


题意概括

  一个序列,要你支持以下操作:

  1. 区间询问最大值

  2. 区间询问历史最大值

  3. 区间加某一个值

  4. 区间赋值

  序列长度<=100000, 操作数<=100000


题解

http://blog.csdn.net/vmurder/article/details/43271091

为了一个傻逼错误找了2个小时的我,实在不想写题解了。请您看上面那个链接 的……


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long LL;
const int N=100005;
const int Inf=2147483647;
struct Tree{
int hMax,Max,hadd,add,hco,co;
}t[N*4];
int n,m,v[N];
void p(int &a,int b){
a=max(a,b);
}
void pushup(int rt){
int ls=rt<<1,rs=ls|1;
t[rt].Max=max(t[ls].Max,t[rs].Max);
p(t[rt].hMax,max(t[ls].hMax,t[rs].hMax));
}
void build(int rt,int L,int R){
t[rt].add=t[rt].hadd=0,t[rt].hco=t[rt].co=-Inf;
if (L==R){
t[rt].Max=t[rt].hMax=v[L];
return;
}
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
build(ls,L,mid);
build(rs,mid+1,R);
pushup(rt);
}
void now_add(int rt,int v){
if (t[rt].co>-Inf)
p(t[rt].hco,t[rt].co+=v);
else
p(t[rt].hadd,t[rt].add+=v);
p(t[rt].hMax,t[rt].Max+=v);
}
void now_cover(int rt,int v){
p(t[rt].hMax,t[rt].Max=v);
p(t[rt].hco,t[rt].co=v);
t[rt].add=0;
}
void his_add(int rt,int v){
p(t[rt].hMax,t[rt].Max+v);
if (t[rt].co>-Inf)
p(t[rt].hco,t[rt].co+v);
else
p(t[rt].hadd,t[rt].add+v);
}
void his_cover(int rt,int v){
p(t[rt].hMax,v);
p(t[rt].hco,v);
}
void pushdown(int rt){
int ls=rt<<1,rs=ls|1;
int &add=t[rt].add,&hadd=t[rt].hadd,&co=t[rt].co,&hco=t[rt].hco;
if (hadd){
his_add(ls,hadd);
his_add(rs,hadd);
hadd=0;
}
if (hco>-Inf){
his_cover(ls,hco);
his_cover(rs,hco);
hco=-Inf;
}
if (add){
now_add(ls,add);
now_add(rs,add);
add=0;
}
if (co>-Inf){
now_cover(ls,co);
now_cover(rs,co);
co=-Inf;
}
}
void update(int rt,int le,int ri,int xle,int xri,int v,int op){
if (le>xri||ri<xle)
return;
if (xle<=le&&ri<=xri){
if (!op)
now_add(rt,v);
else
now_cover(rt,v);
return;
}
pushdown(rt);
int mid=(le+ri)>>1,ls=rt<<1,rs=ls|1;
update(ls,le,mid,xle,xri,v,op);
update(rs,mid+1,ri,xle,xri,v,op);
pushup(rt);
}
int query(int rt,int le,int ri,int xle,int xri,int op){
if (le>xri||ri<xle)
return -Inf;
if (xle<=le&&ri<=xri)
return op?t[rt].hMax:t[rt].Max;
pushdown(rt);
int mid=(le+ri)>>1,ls=rt<<1,rs=ls|1;
return max(query(ls,le,mid,xle,xri,op),query(rs,mid+1,ri,xle,xri,op));
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&v[i]);
build(1,1,n);
scanf("%d",&m);
for (int i=1;i<=m;i++){
char op[5];
int x,y,z;
scanf("%s",op);
if (op[0]=='Q'){
scanf("%d%d",&x,&y);
printf("%d\n",query(1,1,n,x,y,0));
}
if (op[0]=='A'){
scanf("%d%d",&x,&y);
printf("%d\n",query(1,1,n,x,y,1));
}
if (op[0]=='P'){
scanf("%d%d%d",&x,&y,&z);
update(1,1,n,x,y,z,0);
}
if (op[0]=='C'){
scanf("%d%d%d",&x,&y,&z);
update(1,1,n,x,y,z,1);
}
}
return 0;
}

  

BZOJ3064 Tyvj 1518 CPU监控 线段树的更多相关文章

  1. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值

    题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...

  2. 2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)

    传送门 线段树好题. 维护区间加,区间覆盖,区间最大,区间历史最大. 这个东西在国家集训队2016论文集之<区间最值操作与历史最值问题--杭州学军中学 吉如一>中讲的已经很详细了. 简单来 ...

  3. bzoj3064 Tyvj 1518 CPU监控

    Description Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做 ...

  4. [补档][Tyvj 1518]CPU监控

    [Tyvj 1518]CPU监控 题目 Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看 ...

  5. Tyvj 1518 CPU监控(线段树)

    题目描述: Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用 ...

  6. Tyvj 1518 CPU监控——极恶线段树

    题目大意: 给定一个区间及其各个元素的初值,要求支持如下操作: 1.区间加 2.区间赋值 3.查询区间最大值 4.查询区间历史最大值 分析: 容易想到线段树,但是细思恶极(仔细想想恶心到了极点)的是, ...

  7. CPU监控 线段树裸题

    LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...

  8. BZOJ.3064.CPU监控(线段树 历史最值)

    题目链接 \(Description\) 有一个长为n的序列Ai,要求支持查询[l,r]的最值.历史最值,区间加/重设 \(Solution\) 线段树,每个点再维护一个历史(从0到现在)最大值.历史 ...

  9. bzoj 3064: Tyvj 1518 CPU监控

    Description 1.区间加 \(z\) 2.区间覆盖为 \(z\) 3.查询区间最大值 4.查询区间历史最大值 Solution 线段树维护历史最值,思想大致是维护标记出现过的最大值 考虑这种 ...

随机推荐

  1. Java——java错误(The Struts dispatcher cannot be found)

    这通常是由于使用了struts标签,而没有配置相关联的filter.struts标签只有在http请求通过标签的servlet filter过滤器之后才可用,这些过滤器用来为这些标签初始化struts ...

  2. 绘图QPainter-画刷

    Qt提供的画刷风格: Qt.TexturePattern   自定义图像画刷 线性渐变 QLinearGradientPattern QLinearGradient需要传入的参数为需要进行渐变的区域坐 ...

  3. 第16月第10天 poco target

    1. void TCPServer::start() { poco_assert (_stopped); _stopped = false; _thread.start(*this); } void ...

  4. 青云VPC网络配置

    1 创建VPC网络 2 申请公网IP 3 回到VPC图形界面绑定公网ip 4 创建私有网络,并绑定私有网络 5 创建3台主机 6 新建防火墙,并绑定到VPC 7 配置VPC端口转发规则 8 添加防火墙 ...

  5. linux查看防火墙的状态以及开启关闭

    存在以下两种方式: 一.service方式 查看防火墙状态: [root@centos6 ~]# service iptables status 开启防火墙: [root@centos6 ~]# se ...

  6. 有关Linux的.a、.so和.o文件(转)【原文章有些错误,自己已更改】

    gcc 生成 .a静态库和 .so动态库 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库 ...

  7. split('\r\n')

    '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来. 实际我的脚本读取FTP的列表,如果用的split("\r\n"),可以获得正 ...

  8. Fragment与Activity之间的相互通信

    https://blog.csdn.net/u012702547/article/details/49786417 https://blog.csdn.net/carson_ho/article/de ...

  9. springboot系列二、springboot项目搭建

    一.官网快速构建 1.maven构建项目 1.访问http://start.spring.io/ 2.选择构建工具Maven Project.Spring Boot版本2.1.1以及一些工程基本信息, ...

  10. Win10 + Visual Studio 2017 下 OpenCV无法显示图像的问题

    测试代码如下: #include "stdafx.h" #include<opencv2\opencv.hpp> #include<opencv2\highgui ...