[补档][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数的 ...
随机推荐
- [转]AngularJS 之 ng-options指令
原文地址 一. 基本下拉效果(lable for value in array) 其中select标签中的ng-model属性必须有,其值为选中的对象或属性值. <div ng-controll ...
- printf和scanf整理(后续填补)
scanf和printf头文件:<stdio.h> 1.%d.%3d.%03d.%-3d区分 %d:以十进制形式输出整数(int) %3d:指定宽度为3,不足的左边补空格 %03d:一种左 ...
- Kafka官方文档翻译——设计
下面是博主的公众号,后续会发布和讨论一系列分布式消息队列相关的内容,欢迎关注. ------------------------------------------------------------ ...
- 字符串数组与字符串之间的互转(join/split)
1.Java 1-1.字符串数组=>字符串:StringUtils: join(Object[] array, String separator) 例: Java代码 收藏代码 import o ...
- [leetcode-581-Shortest Unsorted Continuous Subarray]
Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...
- 【Android Developers Training】 93. 创建一个空验证器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- laravel如何向视图传递变量的方法
第一种: public function about(){ $name = "cai" return view("sites.about")->with( ...
- PHP实现简单的评论与回复功能还有删除信息
我们首先先看一下功能 上面黑色的是评论的下面红色的字体是回复的 再来看看怎么实现的 1.发布评论 <form action="pinglunchili.php" method ...
- 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)
本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...
- Javacript 学习笔记
一.初探 javacript 学习无法是围绕着对象和属性两个方面来兜圈子,万变不离其宗. 在js中,能点出来的,或者中括号里面的必然是属性(方法).数组除外. 对象调用属性! 对象调用属性! 对象调用 ...