[补档][Tyvj 1518]CPU监控
[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使用率增加ZC 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 -520A 2 7A 4 4Q 4 4P 2 2 -74P 7 9 -71P 7 10 -8A 10 10A 5 9C 1 8 10Q 6 6Q 8 10A 1 7P 9 9 96A 5 5P 8 10 -53P 6 6 5A 10 10A 4 4Q 1 5P 4 9 -69OUTPUT
79-70-70-57910107979-51010
解题报告
#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);
}
[补档][Tyvj 1518]CPU监控的更多相关文章
- bzoj3064 Tyvj 1518 CPU监控
Description Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做 ...
- 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值
题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...
- Tyvj 1518 CPU监控(线段树)
题目描述: Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用 ...
- 3064: Tyvj 1518 CPU监控
注意这题要维护历史最大加和历史最大覆盖 /************************************************************** Problem: 3064 Us ...
- Tyvj 1518 CPU监控——极恶线段树
题目大意: 给定一个区间及其各个元素的初值,要求支持如下操作: 1.区间加 2.区间赋值 3.查询区间最大值 4.查询区间历史最大值 分析: 容易想到线段树,但是细思恶极(仔细想想恶心到了极点)的是, ...
- BZOJ3064 Tyvj 1518 CPU监控 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3064 题意概括 一个序列,要你支持以下操作: 1. 区间询问最大值 2. 区间询问历史最大值 3. ...
- 2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)
传送门 线段树好题. 维护区间加,区间覆盖,区间最大,区间历史最大. 这个东西在国家集训队2016论文集之<区间最值操作与历史最值问题--杭州学军中学 吉如一>中讲的已经很详细了. 简单来 ...
- bzoj 3064: Tyvj 1518 CPU监控
Description 1.区间加 \(z\) 2.区间覆盖为 \(z\) 3.查询区间最大值 4.查询区间历史最大值 Solution 线段树维护历史最值,思想大致是维护标记出现过的最大值 考虑这种 ...
- [补档][Tyvj 1728]普通平衡树
[Tyvj 1728]普通平衡树 题目 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的 ...
随机推荐
- 开发中关于IPv6的问题
问题: 报错信息如下 [root@kube-master iemp]# kubectl logs equipment-139404108-7mc14 -n iemp2017-05-27 05:41:0 ...
- vue setTimeout用法 jquery滚动到某一个div的底部
//vue 中setTimeOut用法 var $this = this; setTimeout(function(){ $this.goEnd() }, 10); goEnd:function(){ ...
- Tomcat中部署web应用 ---- Dubbo服务消费者Web应用war包的部署
样例视频:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd IP: 192.168.2.61 部署容器:apache ...
- php导入csv文件
<?php /** * Created by PhpStorm. * User: hanks * Date: 2017/4/30 * Time: 13:24 */ include 'header ...
- crontab中引入环境变量(比如需要执行tomcat的关闭启动)
起因 crontab中的定时任务,执行到关闭tomcat时,报环境变量找不到 解决方案 1.使用 . /etc/profile 引入环境变量 ###推荐, 实测ubuntu12 成功 2.使用 sou ...
- eclipse在多modules项目结构下避免模块间依赖引用的场景
这个在单一classLoader时,不会有问题.如果多classloader下会有问题. 假设工程有两个模块,module2 依赖module1 当我们执行mvc eclipse:eclipse后,然 ...
- XML 新手入门基础知识
XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识 ...
- Oracle11g 创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题
前提:本机已经安装了Oracle11g数据库. 需求:使用PL SQL数据库连接工具操作Oracle数据库 一.创建表空间和用户 想要操作数据库,首先需要创建用户并给用户授予权限:在创建用户 ...
- 学习java 的经验
一.学习java首先应该对他有个全局的看法 ,他由几部分组成 1.java 的基础语法 2.使用Swing 来做桌面应用,可做嵌入式开发. 3.JDBC数据库的链接 4.网络编程,主要是socket编 ...
- JDBC02 利用JDBC连接数据库【使用数据库连接池】
目录 1/2/3 Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...