[Tyvj 1518]CPU监控

题目

Bob需要一个程序来监视CPU使用率。这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事。
  Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用鼠标乱点之类的事,甚至会一脚踢掉电源……这些事有的会让做这件事的这段时间内CPU使用率增加或减少一个值;有的事还会直接让CPU使用率变为一个值。
当然Bob会询问:在之前给出的事件影响下,CPU在某段时间内,使用率最高是多少。有时候Bob还会好奇地询问,在某段时间内CPU曾经的最高使用率是多少。
为了使计算精确,使用率不用百分比而用一个整数表示。
不保证Bob的事件列表出了莫名的问题,使得使用率为负………………

INPUT

第一行一个正整数T,表示Bob需要监视CPU的总时间。
然后第二行给出T个数表示在你的监视程序执行之前,Bob干的事让CPU在这段时间内每个时刻的使用率达已经达到了多少。
第三行给出一个数E,表示Bob需要做的事和询问的总数。
接下来E行每行表示给出一个询问或者列出一条事件:
Q X Y:询问从X到Y这段时间内CPU最高使用率
A X Y:询问从X到Y这段时间内之前列出的事件使CPU达到过的最高使用率
P X Y Z:列出一个事件这个事件使得从X到Y这段时间内CPU使用率增加Z
C X Y Z:列出一个事件这个事件使得从X到Y这段时间内CPU使用率变为Z
时间的单位为秒,使用率没有单位。
X和Y均为正整数(X<=Y),Z为一个整数。
从X到Y这段时间包含第X秒和第Y秒。
保证必要运算在有符号32位整数以内。

OUTPUT

对于每个询问,输出一行一个整数回答。

SAMPLE

INPUT

10
-62 -83 -9 -70 79 -78 -31 40 -18 -5
20
A 2 7
A 4 4
Q 4 4
P 2 2 -74
P 7 9 -71
P 7 10 -8
A 10 10
A 5 9
C 1 8 10
Q 6 6
Q 8 10
A 1 7
P 9 9 96
A 5 5
P 8 10 -53
P 6 6 5
A 10 10
A 4 4
Q 1 5
P 4 9 -69

OUTPUT

79
-70
-70
-5
79
10
10
79
79
-5
10
10

解题报告

这道极其简(e)单(xin),真的是一道裸(zhi)的(zhang)线段树。
首先,我们需要维护各种奇奇怪怪的域,当前和,当前最大值,历史和,历史最大值,而历史值又不包括当前值,这就导致了lazy操作的pushdown极其好(nan)写。
没有什么好多说的,直接看这个极其漂(chou)亮(lou)的代码= =
 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf=<<;
inline int read(){
int sum(),f();
char ch(getchar());
while(ch<''||ch>''){
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
sum=sum*+ch-'';
ch=getchar();
}
return sum*f;
}
int n,m;
int v[];
int padd[],pset[],pmx[];
int nadd[],nset[],nmx[];
inline int my_max(int a,int b){
return a>b?a:b;
}
inline void pushup(int i){
int l(i<<),r(l|);
pmx[i]=my_max(pmx[l],pmx[r]);
nmx[i]=my_max(nmx[l],nmx[r]);
}
inline void pushdown(int rt){
int ch(rt<<);
for(int i=;i<=;i++){
int nowch(ch+i);
pmx[nowch]=my_max(pmx[nowch],my_max(padd[rt]+nmx[nowch],pset[rt]));
if(nset[rt]==inf){
nmx[nowch]+=nadd[rt];
if(nset[nowch]==inf){
padd[nowch]=my_max(padd[nowch],nadd[nowch]+padd[rt]);
nadd[nowch]+=nadd[rt];
}
else{
pset[nowch]=my_max(pset[nowch],nset[nowch]+padd[rt]);
nset[nowch]=nmx[nowch];
}
}
else{
if(nset[nowch]==inf){
padd[nowch]=my_max(padd[nowch],nadd[nowch]+padd[rt]);
nadd[nowch]+=padd[rt];
}
else
pset[nowch]=my_max(pset[nowch],nmx[nowch]+padd[rt]);
nmx[nowch]=nset[rt];
nset[nowch]=nset[rt];
pset[nowch]=my_max(pset[rt],pset[nowch]);
}
}
nadd[rt]=;
padd[rt]=;
nset[rt]=inf;
pset[rt]=inf;
}
inline void build(int l,int r,int i){
padd[i]=;
pset[i]=inf;
nadd[i]=;
nset[i]=inf;
if(l==r){
pmx[i]=v[l];
nmx[i]=v[l];
return;
}
int lc(i<<),rc(lc|),mid((l+r)>>);
build(l,mid,lc);
build(mid+,r,rc);
pushup(i);
}
inline void update_set(int ll,int rr,int c,int l,int r,int i){
if(ll<=l&&r<=rr){
nset[i]=c;
nmx[i]=c;
pset[i]=my_max(pset[i],nset[i]);
pmx[i]=my_max(pmx[i],nmx[i]);
return;
}
pushdown(i);
int lc(i<<),rc(lc|),mid((l+r)>>);
if(ll<=mid)
update_set(ll,rr,c,l,mid,lc);
if(rr>mid)
update_set(ll,rr,c,mid+,r,rc);
pushup(i);
}
inline void update_add(int ll,int rr,int c,int l,int r,int i){
if(ll<=l&&r<=rr){
nmx[i]+=c;
pmx[i]=my_max(pmx[i],nmx[i]);
if(nset[i]==inf){
nadd[i]+=c;
padd[i]=my_max(padd[i],nadd[i]);
}
else{
nset[i]=nmx[i];
pset[i]=my_max(pset[i],nset[i]);
}
return;
}
pushdown(i);
int lc(i<<),rc(lc|),mid((l+r)>>);
if(ll<=mid)
update_add(ll,rr,c,l,mid,lc);
if(rr>mid)
update_add(ll,rr,c,mid+,r,rc);
pushup(i);
}
inline int query_p(int ll,int rr,int l,int r,int i){
if(ll<=l&&r<=rr)
return pmx[i];
pushdown(i);
int lc(i<<),rc(lc|),mid((l+r)>>);
int ret(inf);
if(ll<=mid)
ret=my_max(ret,query_p(ll,rr,l,mid,lc));
if(rr>mid)
ret=my_max(ret,query_p(ll,rr,mid+,r,rc));
return ret;
}
inline int query_n(int ll,int rr,int l,int r,int i){
if(ll<=l&&r<=rr)
return nmx[i];
pushdown(i);
int lc(i<<),rc(lc|),mid((l+r)>>);
int ret(inf);
if(ll<=mid)
ret=my_max(ret,query_n(ll,rr,l,mid,lc));
if(rr>mid)
ret=my_max(ret,query_n(ll,rr,mid+,r,rc));
return ret;
}
int main(){
n=read();
for(int i=;i<=n;i++)
v[i]=read();
/*for(int i=1;i<=n;i++)
cout<<v[i]<<' ';*/
build(,n,);
m=read();
char op[];
while(m--){
scanf("%s",op);
if(op[]=='Q'){
int x(read()),y(read());
printf("%d\n",query_n(x,y,,n,));
continue;
}
if(op[]=='A'){
int x(read()),y(read());
printf("%d\n",query_p(x,y,,n,));
continue;
}
if(op[]=='P'){
int x(read()),y(read()),z(read());
update_add(x,y,z,,n,);
continue;
}
if(op[]=='C'){
int x(read()),y(read()),z(read());
update_set(x,y,z,,n,);
continue;
}
}//while(1);
}
ps:本以为可以写到200行,后来pushdown强行压了一半,然后各种压行,形成了如此漂(chou)亮(lou)的代码风格= =

[补档][Tyvj 1518]CPU监控的更多相关文章

  1. bzoj3064 Tyvj 1518 CPU监控

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

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

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

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

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

  4. 3064: Tyvj 1518 CPU监控

    注意这题要维护历史最大加和历史最大覆盖 /************************************************************** Problem: 3064 Us ...

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

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

  6. BZOJ3064 Tyvj 1518 CPU监控 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3064 题意概括 一个序列,要你支持以下操作: 1. 区间询问最大值 2. 区间询问历史最大值 3. ...

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

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

  8. bzoj 3064: Tyvj 1518 CPU监控

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

  9. [补档][Tyvj 1728]普通平衡树

    [Tyvj 1728]普通平衡树 题目 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的 ...

随机推荐

  1. C# 短信发送 邮件发送

    兴趣是最好的老师. --爱因斯坦 一.实现短信发送 1.使用短信mao的方式进行短信发送,前提要购买硬件设备,这里就不考虑展示了: 2.使用中国网建提供的短信平台,但是用几次后要收费: 我们这里主要介 ...

  2. MySQL,Oracle,PostgreSQL通过web方式管理维护, 提高开发及运维效率

    在开发及项目运维中,对数据库的操作大家目前都是使用客户端工具进行操作,例如MySQL的客户端工具navicat,Oracle的客户端工具 PL/SQL Developer, MSSQL的客户端工具查询 ...

  3. Oracle 分页方法研究

    1.Oracle 中的三大分页方法 1.1.通过分析函数分页 1.2.通过 ROWNUM 分页 1.3.通过 ROWID 分页 2.Oracle 分页解决方案浅析 2.1.纯后端代码完成分页 2.2. ...

  4. java wait 和notify

    这几天自己学习了一下线程的知识,wait 方法使当前的线程等待,notify 方法 唤醒当前的线程的方法 th 线程在5的时候进行wait,此时主线程继续执行, 主线程执行到9的时候 唤醒 th 线程 ...

  5. SQL检测开始日期 结束日期 是否存在交叉

    检测开始日期 结束日期 是否存在交叉 "+tj+" and ((starttime>="+starttime+" and starttime<=&q ...

  6. jquery获得表格可见行的大小数量

    alert($("#tableId").find("tbody tr[moban='true']").find(":visible").si ...

  7. 第一章(认识jQuery)

    1.3.2编写简单的jQuery代码 ①$是jQuery的简写 ②$("#foo") = $("#foo") ③$.ajax  =  jQuery.ajax ④ ...

  8. iOS 实时录音和播放

    需求:最近公司需要做一个楼宇对讲的功能:门口机(连接WIFI)拨号对室内机(对应的WIFI)的设备进行呼叫,室内机收到呼叫之后将对收到的数据进行UDP广播的转发,手机(连接对应的WIFI)收到视频流之 ...

  9. MaintainableCSS 《可维护性 CSS》 --- ID 篇

    ID 从语法上讲,当只有一个实例时,我们应该使用一个ID.当有多个时,我们应该使用一个 class. 但是,ID 作用的优先级高于 class ,在我们想覆盖一个样式的时候,这就会导致问题. 为了演示 ...

  10. 简单说下Kanzi Studio

    一.Project 窗口 在Project窗口下可以创建界面节点,包含有Screen和Prefabs 二.Properties窗口 包含有节点的相关属性,不同类型的节点,属性不同.主要通过改变节点的属 ...