欢迎访问~原文出处——博客园-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. This page is about building Firefox Desktop

    This page is about building Firefox Desktop The Mozilla build system, like the rest of the Mozilla c ...

  2. VS中修改工程名的解决方案

    VS中修改工程名的解决方案: 一.先修改工程名/解决方案名(在VS中修改即可)举例,原先的工程名为OldProject   想要改成NewProject1.找到工程/解决方案所在的文件夹(已工程名/解 ...

  3. DjangoAdmin自定义过滤器

    class UserIDFilter(admin.SimpleListFilter): # 自定义用户查询过滤器 title = _('关联用户') parameter_name = 'user_id ...

  4. B - 低阶入门膜法 - D-query (查询区间内有多少不同的数)

    题目链接:https://cn.vjudge.net/contest/284294#problem/B 题目大意:查询区间内有多少个不相同的数. 具体思路:主席树的做法,主席树的基础做法是查询区间第k ...

  5. Java InputStream 、 InputStreamReader和BufferedReader

    https://blog.csdn.net/zgljl2012/article/details/47267609 在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法 ...

  6. Modelsim SE 破解教程

    第一步:打开我们提供的破解工具包. 第二步:拷贝crack.bat和MentorKG.exe到"C:\modeltech64_10.2c\win64"路径下,如果你的电脑为32位, ...

  7. Pytorch入门之VAE

    关于自编码器的原理见另一篇博客 : 编码器AE & VAE 这里谈谈对于变分自编码器(Variational auto-encoder)即VAE的实现. 1. 稀疏编码 首先介绍一下“稀疏编码 ...

  8. ARMV8 datasheet学习笔记2:概述

    1. 前言 本文主要概括的介绍ARMV8体系结构定义了哪些内容,概括的说: ARM体系结构定义了PE的行为,不会定义具体的实现 ARM体系结构也定义了debug体系结构和trace体系结构 ARM体系 ...

  9. 网络常用的linux系统调用

    网络之常用的Linux系统调用 下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别. 一.进程控制 fo ...

  10. git操作之冲突解决

    应用场景,任哥,我两个人共同修改了git项目上的一个文件.zsh命令行模式 准备工作 简写命令解释 gl=git pullgp=git pushgst=git statusgcmsg=git comm ...