bzoj3064 Tyvj 1518 CPU监控
Description
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
-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
Sample Output
-70
-70
-5
79
10
10
79
79
-5
10
10
HINT
数据分布如下:
第1、2个数据保证T和E均小于等于1000
第3、4个数据保证只有Q类询问
第5、6个数据保证只有C类事件
第7、8个数据保证只有P类事件
全部数据保证T和E均小于等于100000
正解:线段树。
这道吉司机论文题真的是搞得我心力憔悴。。
去学了下线段树的历史最值操作。对于历史最值操作,我们只要蒯一套当前标记就行了,相当于是维护两棵线段树,一棵是当前线段树,一棵是历史线段树。我们可以把历史最值操作理解成线段树每个结点都是一个队列,当前线段树维护的是队尾,历史线段树维护的是队列中的最值。所以我们每次下放时,要先下放历史标记,再下放当前标记。这道题带区间覆盖,所以下放特别麻烦,就不展开说了,看看代码吧。。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1<<30)
#define N (100010)
#define ls (x<<1)
#define rs (x<<1|1)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; int nmx[*N],nadd[*N],ncov[*N];
int pmx[*N],padd[*N],pcov[*N];
int n,m;
char s[]; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void pushup(RG int x){ nmx[x]=max(nmx[ls],nmx[rs]),pmx[x]=max(pmx[ls],pmx[rs]); return; } il void pushdown(RG int x){
for (RG int i=,s;i<=;++i){
s=x<<|i,pmx[s]=max(pmx[s],max(padd[x]+nmx[s],pcov[x]));
if (ncov[x]==-inf){
nmx[s]+=nadd[x];
if (ncov[s]==-inf) padd[s]=max(padd[s],nadd[s]+padd[x]),nadd[s]+=nadd[x];
else pcov[s]=max(pcov[s],ncov[s]+padd[x]),ncov[s]=nmx[s];
} else{
if (ncov[s]==-inf) padd[s]=max(padd[s],nadd[s]+padd[x]);
else pcov[s]=max(pcov[s],nmx[s]+padd[x]);
nmx[s]=ncov[s]=ncov[x],pcov[s]=max(pcov[s],pcov[x]);
}
}
nadd[x]=padd[x]=,ncov[x]=pcov[x]=-inf; return;
} il void build(RG int x,RG int l,RG int r){
ncov[x]=pcov[x]=-inf; if (l==r){ nmx[x]=gi(),pmx[x]=nmx[x]; return; }
RG int mid=(l+r)>>; build(ls,l,mid),build(rs,mid+,r); pushup(x); return;
} il void update(RG int x,RG int l,RG int r,RG int xl,RG int xr,RG int v,RG int fg){
if (xl<=l && r<=xr){
if (!fg){
pmx[x]=max(pmx[x],nmx[x]+=v);
if (ncov[x]==-inf) padd[x]=max(padd[x],nadd[x]+=v);
else pcov[x]=max(pcov[x],ncov[x]=nmx[x]);
} else pmx[x]=max(pmx[x],nmx[x]=v),pcov[x]=max(pcov[x],ncov[x]=v);
return;
}
pushdown(x); RG int mid=(l+r)>>;
if (xr<=mid) update(ls,l,mid,xl,xr,v,fg);
else if (xl>mid) update(rs,mid+,r,xl,xr,v,fg);
else update(ls,l,mid,xl,mid,v,fg),update(rs,mid+,r,mid+,xr,v,fg);
pushup(x); return;
} il int query(RG int x,RG int l,RG int r,RG int xl,RG int xr,RG int fg){
if (xl<=l && r<=xr) return fg ? pmx[x] : nmx[x];
pushdown(x); RG int mid=(l+r)>>;
if (xr<=mid) return query(ls,l,mid,xl,xr,fg);
else if (xl>mid) return query(rs,mid+,r,xl,xr,fg);
else return max(query(ls,l,mid,xl,mid,fg),query(rs,mid+,r,mid+,xr,fg));
} il void work(){
n=gi(); build(,,n); m=gi();
for (RG int i=,l,r,z;i<=m;++i){
scanf("%s",s);
if (s[]=='Q') l=gi(),r=gi(),printf("%d\n",query(,,n,l,r,));
if (s[]=='A') l=gi(),r=gi(),printf("%d\n",query(,,n,l,r,));
if (s[]=='P') l=gi(),r=gi(),z=gi(),update(,,n,l,r,z,);
if (s[]=='C') l=gi(),r=gi(),z=gi(),update(,,n,l,r,z,);
}
return;
} int main(){
File("cpu");
work();
return ;
}
bzoj3064 Tyvj 1518 CPU监控的更多相关文章
- BZOJ3064 Tyvj 1518 CPU监控 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3064 题意概括 一个序列,要你支持以下操作: 1. 区间询问最大值 2. 区间询问历史最大值 3. ...
- 2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)
传送门 线段树好题. 维护区间加,区间覆盖,区间最大,区间历史最大. 这个东西在国家集训队2016论文集之<区间最值操作与历史最值问题--杭州学军中学 吉如一>中讲的已经很详细了. 简单来 ...
- [补档][Tyvj 1518]CPU监控
[Tyvj 1518]CPU监控 题目 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.查询区间历史最大值 分析: 容易想到线段树,但是细思恶极(仔细想想恶心到了极点)的是, ...
- bzoj 3064: Tyvj 1518 CPU监控
Description 1.区间加 \(z\) 2.区间覆盖为 \(z\) 3.查询区间最大值 4.查询区间历史最大值 Solution 线段树维护历史最值,思想大致是维护标记出现过的最大值 考虑这种 ...
- 【BZOJ3064】CPU监控(线段树)
[BZOJ3064]CPU监控(线段树) 题面 BZOJ 洛谷 题解 神仙\(zsy\)出在了\(noip\)模拟的题目.(然而\(zsy\)出的还是这题的升级版) 首先明确一点,这题是一个吉司机线段 ...
随机推荐
- FormData+Ajax 实现多文件上传 学习使用FormData对象
FormData对象是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利. 今天我们使用dropzone和FormData实现多文件上传功能. var SAMP = null; / ...
- 【WCF】错误处理(二):错误码―—FaultCode
先来说说SOAP消息中错误消息的包装结构,一条SOAP错误消息的大致形式如下: <s:Fault> <faultcode xmlns:a="me-cust-error&qu ...
- QQ好友在线/离线,怎么测试?
即时通讯是目前internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,那么今天主要针对QQ好友在线状态/QQ群友在线状态功能出发,一起思考其中的实现原理以及我们如何去测试此功能? 当大 ...
- Omi框架学习之旅 - Hello World 及原理说明
学什么东西都从hello world开始, 我也不知道为啥. 恩,先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. hello world - demo: class Hello e ...
- (6)简单说说java中的线程
先甩出来两种创建线程的方法: private static int count = 100; public static void main(String[] args) { // 用继承Thread ...
- rsync (windows 服务端,linux客户端)将windows上的数据同步到linux服务器,反之也可
一:总体概述. 1.windows上面首先装CW_rsync_Server.4.1.0_installer,安装时要输入的用户名密码要记住哦!接下来就是找到rsyncd.conf进入配置细节 2.li ...
- python全栈开发第10天-正则表达式
正则表达式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式 ...
- IOS百度地图之--->第一篇《环境配置与基本使用》
Ios 百度地图SDK简易使用说明:http://developer.baidu.com/map/index.php?title=iossdk 先道歉:对于原来上传的Demo我很抱歉,什么都没有,也没 ...
- 整理:20个非常有用的Java程序片段
下面是20个非常有用的Java程序片段,希望能对你有用. 1. 字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric strin ...
- 为什么你应该抛弃Express的视图渲染引擎
Nodejs Express框架的一个被人们广为使用的特性是它的渲染引擎.Express视图渲染引擎允许Controller提供一个视图名称和视图模型对象给Express,然后返回由HTTP响应流输出 ...