欢迎访问~原文出处——博客园-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. VUE2.0 饿了吗视频学习笔记(六):定位问题、文字显示、模糊背景图片、点击事件

    一.定位问题按照视频写代码时,发现元素“5个“”定位不对,如下图 正常位置为 还以为是哪里写错了,仔细研究了下,需要在父div上加relative. position:relative/absolut ...

  2. django学习~forms

    一 简介 今天咱们来聊聊 django强大的表单功能二 Froms作用   1 自动生成HTML表单元素   2 检查表单数据的合法性   3 如果验证错误,重新显示表单(数据不会重置)   4 数据 ...

  3. C语言练手游戏-控制台输出一个会移动的坦克

    把C语言的知识融合起来做一个练手的小游戏项目,将自己掌握到的数据结构.数组.函数.宏定义等知识综合利用,增加对语法的熟练程度. 操作系统: windows 10 x64 编译IDE : VS2015 ...

  4. python 历险记(一)— python 的String,集合(List,元组,Dict)

    目录 引言 String 有哪些有用的方法? 如何拼接字符串? 如何分隔字符串? 如何获取字符串长度 如何将 list 拼接成字符串? 如何替换字符串? 如何去除字符串中的空格? 如何子字符串是否包含 ...

  5. VS2013+Win10+opencv3.0配置(包括opencv2.4.10版本)

    在win下配置opencv3.0.0还是比较简单的,这里简单说一下配置过程:参考链接:http://blog.csdn.net/u010009145/article/details/50756751 ...

  6. k64 datasheet学习笔记3---Chip Configuration之System modules

    1.前言 本文主要介绍芯片配置的系统模块的内容 2.SIM配置 TODO 3.SMC配置 TODO 4.PMC配置 TODO 5.LOW-LEAKAGE WAKEUP单元配置 TODO 6.MCM配置 ...

  7. linux统计某个特定文件名的大小总和【原创】

    [hch@EAISRVBJ2 log]$find ./ -name "test_chs_00*"|xargs du -ck|grep total|awk 'BEGIN{sum=0} ...

  8. div里 datapicker显示异常的情况之一

    现象:datepicker控价显示一半 因为Div高度太小所以设置一个最小高度min-height这样就可以让时间控价显示完整了.

  9. plsql developer日期类型数据格式不对如何设置?

    当把一个数据库中的数据复制到另一个数据库时,如果数据中包含日期类型,会提示数据格式不正确.或者两个plsql developer设置不同,但实际上建表语句一样. 此时可在plsql中做如下设置: 首选 ...

  10. art 校准时设备端操作

    (1)准备所需文件art.ko  和 nart.out (2)配置设备的IP地址(例如:192.168.2.122),使之能与本地PC通信 (3)上传文件到设备 cd /tmp tftp -g -r ...