CPU监控

题目描述

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[1];
inline int rd(){
    int x=0;char c=getchar();bool f=0;
    while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return f?-x:x;
}
struct node{
    int x,y;
    node(int xx=0,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=1;
struct seg{
    int l,r;
    node now,la;
    int nowmax,lamax;
}tr[N<<1];
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)>>1;
    ls=++tot;rs=++tot;
    build(ls,l,mid);build(rs,mid+1,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)>>1;
    pushdown(cnt);
    if(mid>=L)upd(ls,l,mid,L,R,x);
    if(mid<R)upd(rs,mid+1,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)>>1;
    pushdown(cnt);
    if(mid>=L&&mid<R)return max(query(ls,l,mid,L,R,tag),query(rs,mid+1,r,L,R,tag));
    else if(mid>=L)return query(ls,l,mid,L,R,tag);else if(mid<R)return query(rs,mid+1,r,L,R,tag);
}
int main(){
    int n=rd();
    build(1,1,n);
    int q=rd();int x,y,z;
    while(q--){
        scanf("%s",s);x=rd();y=rd();
        if(s[0]=='Q'){
            printf("%d\n",query(1,1,n,x,y,1));
        }
        else if(s[0]=='A'){
            printf("%d\n",query(1,1,n,x,y,0));
        }
        else if(s[0]=='P'){
            z=rd();
            upd(1,1,n,x,y,node(z,-inf));
        }
        else{
            z=rd();
            upd(1,1,n,x,y,node(-inf,z));
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10453046.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件名称:LP_CPUMonitor服务器CPU监控小工具 版本:1.0 网址: 软件说明:监控CPU的使用率。可以自行设定CPU超过持续多长时间超过多少百分比的时候报警。超过设置比率的时候,系统会自动记录日志。 同时,根据设置,决定是否发送警报邮件到指定的邮箱。另外,可以设置CPU超过设定值的时候,自动删除某个进程。 作用:譬如作者网站,站长帮手网,每天会有一到两次CPU占用率会达到100%。后经观察,是因为每天查询数据过大,导致IIS连接假死,导致占用大量的CPU。 而通过回收进程和停止进程都不能达到马上见效的作用,而结束w3wp.exe进程的话,CPU使用率会马上降下来,而且不影响网站的正常运行。 因为IIS会自动马上启动一个新的w3wp.exe进程。使用本软件后,站长帮手网服务器运行很稳定。 作者:草上飞 QQ:1469886 本工具如果不能运行,请与作者联系。 设置说明,请按照以下说明修改config.ini文件。 自行修改值。不要随意改动=后前面的参数名称,否则造成系统出错。 [alerttime=15] 持续多长时间报警 [bemail=true] 是否启用EMAIL报警 [bkill=true] 是否自动结束进程 [process=w3wp.exe] 结束的进程名称,为空则自动删除占用CPU最高的进程。 [maxcpu=95] 持续大于等于这个CPU使用率则报警 [smtp=xxx@newbooks.com.cn;xxx;xxxxx;mail.newbooks.com.cn]smtp设置。格式为:邮箱;用户名;密码;邮箱服务器 [receivemail=xxx@newbooks.com.cn] 接受邮件者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值