题目描述

Bob需要一个程序来监视CPU使用率。这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事。

Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用鼠标乱点之类的事,甚至会一脚踢掉电源……这些事有的会让做这件事的这段时间内CPU使用率增加或减少一个值;有的事还会直接让CPU使用率变为一个值。

当然Bob会询问:在之前给出的事件影响下,CPU在某段时间内,使用率最高是多少。有时候Bob还会好奇地询问,在某段时间内CPU曾经的最高使用率是多少。

为了使计算精确,使用率不用百分比而用一个整数表示。

不保证Bob的事件列表出了莫名的问题,使得使用率为负………………

第一行一个正整数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位整数以内。

题解

这道题如果没有第二个操作的话,就是一道线段树入门题。

现在要求维护历史最大值,我们需要在线段树上的懒标记上下手。

我们令一个标记为(a,b)表示当前add的数为x,达到的最大值为y。

那么合并两个标记(a,b)(c,d)就是(a+c,max(b+c,d))。

最后面的取max是讨论了当前操作是修改还是增量,若增量就取前者,否则取后者。

然后我们对线段树上的每一个节点维护两个标记,当前标记和历史最大标记。

对于历史标记的维护,我们就把当前标记加上刚来的标记后和这个历史标记按位取个max。

对于当前标记直接合并即可。

同时维护两个变量:当前最大值和历史最大值,这个比较好维护。

代码

#include<iostream>
#include<cstdio>
#define ls tr[cnt].l
#define rs tr[cnt].r
#define inf 1e9
#define N 100009
using namespace std;
char s[];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
struct node{
int x,y;
node(int xx=,int yy=-inf){x=xx;y=yy;}
inline node operator +(const node &b)const{return node(max((int)-inf,x+b.x),max(y+b.x,b.y));}
inline node operator *(const node &b)const{return node(max(x,b.x),max(y,b.y));}
};
int tot=;
struct seg{
int l,r;
node now,la;
int nowmax,lamax;
}tr[N<<];
inline void pushup(int cnt){
tr[cnt].nowmax=max(tr[ls].nowmax,tr[rs].nowmax);
tr[cnt].lamax=max(tr[ls].lamax,tr[rs].lamax);
}
inline void pushdown(int cnt){
node x=tr[cnt].now,y=tr[cnt].la;
tr[rs].la=tr[rs].la*(tr[rs].now+y);
tr[rs].now=tr[rs].now+x;
tr[rs].lamax=max(tr[rs].lamax,max(tr[rs].nowmax+y.x,y.y));
tr[rs].nowmax=max(tr[rs].nowmax+x.x,x.y);
tr[ls].la=tr[ls].la*(tr[ls].now+y);
tr[ls].now=tr[ls].now+x;
tr[ls].lamax=max(tr[ls].lamax,max(tr[ls].nowmax+y.x,y.y));
tr[ls].nowmax=max(tr[ls].nowmax+x.x,x.y);
tr[cnt].now=tr[cnt].la=node();
}
void build(int cnt,int l,int r){
tr[cnt].now=tr[cnt].la=node();
if(l==r){tr[cnt].nowmax=rd();tr[cnt].lamax=tr[cnt].nowmax;return;}
int mid=(l+r)>>;
ls=++tot;rs=++tot;
build(ls,l,mid);build(rs,mid+,r);
pushup(cnt);
}
void upd(int cnt,int l,int r,int L,int R,node x){
if(l>=L&&r<=R){
tr[cnt].la=tr[cnt].la*(tr[cnt].now+x);
tr[cnt].now=tr[cnt].now+x;
tr[cnt].nowmax=max(tr[cnt].nowmax+x.x,x.y);
tr[cnt].lamax=max(tr[cnt].lamax,tr[cnt].nowmax);
return;
}
int mid=(l+r)>>;
pushdown(cnt);
if(mid>=L)upd(ls,l,mid,L,R,x);
if(mid<R)upd(rs,mid+,r,L,R,x);
pushup(cnt);
}
int query(int cnt,int l,int r,int L,int R,int tag){
if(l>=L&&r<=R)return tag?tr[cnt].nowmax:tr[cnt].lamax;
int mid=(l+r)>>;
pushdown(cnt);
if(mid>=L&&mid<R)return max(query(ls,l,mid,L,R,tag),query(rs,mid+,r,L,R,tag));
else if(mid>=L)return query(ls,l,mid,L,R,tag);else if(mid<R)return query(rs,mid+,r,L,R,tag);
}
int main(){
int n=rd();
build(,,n);
int q=rd();int x,y,z;
while(q--){
scanf("%s",s);x=rd();y=rd();
if(s[]=='Q'){
printf("%d\n",query(,,n,x,y,));
}
else if(s[]=='A'){
printf("%d\n",query(,,n,x,y,));
}
else if(s[]=='P'){
z=rd();
upd(,,n,x,y,node(z,-inf));
}
else{
z=rd();
upd(,,n,x,y,node(-inf,z));
}
}
return ;
}

CPU监控的更多相关文章

  1. C#实现对远程服务器的内存和CPU监控

    C#实现对远程服务器的内存和CPU监控小记 1.  主要使用到的组件有System.Management.dll 2.  主要类为 :ManagementScope 连接远程服务器示例代码: priv ...

  2. Linux CPU监控指标

    Linux CPU监控指标 Linux提供了非常丰富的命令可以进行CPU相关数据进行监控,例如:top.vmstat等命令.top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执 ...

  3. [补档][Tyvj 1518]CPU监控

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

  4. CPU监控 解题报告

    CPU监控 这种题就需要小黄鸭调试法,不行就重构,动态gdb可能会死人,一堆tag的... 维护历史最值的一个核心是历史最值tag,它的意义是从上一次这个点下放tag之后到当前时刻的这个点的tag达到 ...

  5. 【BZOJ3064】CPU监控(线段树)

    [BZOJ3064]CPU监控(线段树) 题面 BZOJ 洛谷 题解 神仙\(zsy\)出在了\(noip\)模拟的题目.(然而\(zsy\)出的还是这题的升级版) 首先明确一点,这题是一个吉司机线段 ...

  6. BZOJ 3064 CPU监控

    题目链接:CPU监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...

  7. 安卓app测试之cpu监控

    安卓app测试之cpu监控,如何获取监控的cpu数据呢? 一.通过Dumpsys 来取值 1.adb shell dumpsys cpuinfo 二.top 1.top -d 1|grep packa ...

  8. 轻量级监控平台之cpu监控

    轻量级监控平台之cpu监控脚本 #!/bin/bash #进程监控脚本 #功能需求: 上报机器的硬件层面-cpu负载数据 . /etc/profile . ~/.bash_profile pushur ...

  9. [BZOJ3064][Tyvj1518] CPU监控

    题目:[BZOJ3064][Tyvj1518] CPU监控 思路: 线段树专题讲的.以下为讲课时的课件: 给出序列,要求查询一些区间的最大值.历史最大值,支持区间加.区间修改.序列长度和操作数< ...

  10. 基于 HTML5 WebGL 的 CPU 监控系统

    前言 科技改变生活,科技的发展带来了生活方式的巨大改变.随着通信技术的不断演进,5G 技术应运而生,随时随地万物互联的时代已经来临.5G 技术不仅带来了更快的连接速度和前所未有的用户体验,也为制造业, ...

随机推荐

  1. 类和对象,以及 LeetCode 每日一题

    所有类都是引用类型. 1 定义类 类是某一批对象的抽象. 1.1 定义类的语法: [修饰符] class 类名{ 零到多个构造器定义 零到多个成员变量 零到多个方法 } 对于一个类定义而言,可以包含三 ...

  2. Python二级-----------程序冲刺5

    1. 编写程序,从键盘上获得用户连续输入且用逗号分隔的若干个数字(不必以逗号结尾),计算所有输入数字的和并输出,给出代码提示如下.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪ ...

  3. 面试常问的几个排序和查找算法,PHP实现

    冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...

  4. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

  5. Windows下配置Git多账号github码云

    Windows下配置Git多账号github码云 1.配置了全局用户名和邮箱 $ git config --global user.email "你的邮箱" $ git confi ...

  6. Dynamics 365-关于Solution的那些事(二)

    接着上一篇的说,现在有一个已知前提:Solution的增量特性.然后我们再思考这么一个场景,项目开发过程中,存在多次迭代的情况,每次迭代可能涉及到的solution是同一个,唯一区别的,就是solut ...

  7. ClickOnce一项Winform部署

    先建一个Winform 控制台程序 建好后从工具箱里拖出来个 文本框 在属性中把TEXT改了 鼠标放到项目上点击右键——>属性 如下图所示,有两个发布位置. 发布位置可以选择本地文件夹,也可以选 ...

  8. Postgres中文分词

    环境 CentOS Linux release 7.2.1511 (Core) 安装Postgres 安装postgres很简单 yum安装 sudo yum install postgresql-s ...

  9. Linux(Manjaro) -Docker 安装及基本配置

    Linux(Manjaro) -Docker 安装及基本配置 基本安装 # Pacman 安装 Docker sudo pacman -S docker # 启动docker服务 sudo syste ...

  10. Linux云计算运维-MySQL

    0.建初心 优秀DBA的素质 1.人品,不做某些事情2.严谨,运行命令前深思熟虑,三思而后行,即使是依据select3.细心,严格按照步骤一步一步执行,减少出错4.心态,遇到灾难,首先要稳住,不慌张, ...