CPU监控 解题报告

CPU监控

这种题就需要小黄鸭调试法,不行就重构,动态gdb可能会死人,一堆tag的...

维护历史最值的一个核心是历史最值tag,它的意义是从上一次这个点下放tag之后到当前时刻的这个点的tag达到过的最大值。

我们注意到tag的作用是按找时间限制的,所以我们可以认为历史最大tag是一个前缀最大值。

有了历史最值tag,我们就可以完成pushdown的工作辣

就把历史tag放给儿子的历史tag和历史最值,这时候更新需要用儿子的当前值结合自己的历史最大进行更新。

对这个题维护一个二元组\(tag(a,b)\),这个tag对值\(v\)就表示\(\max(v+a,b)\),区间加就是\((c,-inf)\),区间覆盖\((-inf,c)\)

考虑两个按时间顺序的tag的合并(a,b)与(c,d),那么合并以后是\((a+c,\max(b+c,d))\)

注意\(a+c\)对\(-inf\)取个\(\max\),否则可能会爆掉int...

然后注意一下细节就可以了



Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
using std::max;
template <class T>
void read(T &x)
{
    int f=0;x=0;char c=getchar();
    while(!isdigit(c)) f|=c=='-',c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    if(f) x=-x;
}
const int inf=0x3f3f3f3f;
const int N=1e5+10;
#define ls id<<1
#define rs id<<1|1
int n,m,a[N];
struct koito_yuu
{
    int a,b;
    koito_yuu(){}
    koito_yuu(int A,int B){a=A,b=B;}
    koito_yuu friend operator +(koito_yuu a,koito_yuu b){return koito_yuu(max(-inf,a.a+b.a),max(a.b+b.a,b.b));}
    int friend operator +(koito_yuu a,int b){return max(a.a+b,a.b);}
    void upt(koito_yuu v){a=max(a,v.a),b=max(b,v.b);}
}tag[N<<2],histag[N<<2];
int mx[N<<2],hismx[N<<2];
void updata(int id)
{
    mx[id]=max(mx[ls],mx[rs]);
    hismx[id]=max(hismx[ls],hismx[rs]);
}
void pushdown(int id)
{
    if(tag[id].a||tag[id].b!=-inf)
    {
        hismx[ls]=max(hismx[ls],histag[id]+mx[ls]);
        hismx[rs]=max(hismx[rs],histag[id]+mx[rs]);
        histag[ls].upt(tag[ls]+histag[id]);
        histag[rs].upt(tag[rs]+histag[id]);
        histag[id]=koito_yuu(0,-inf);

        tag[ls]=tag[ls]+tag[id];
        tag[rs]=tag[rs]+tag[id];
        mx[ls]=tag[id]+mx[ls];
        mx[rs]=tag[id]+mx[rs];
        tag[id]=koito_yuu(0,-inf);
    }
}
void build(int id,int l,int r)
{
    tag[id]=histag[id]=koito_yuu(0,-inf);
    if(l==r)
    {
        mx[id]=hismx[id]=a[l];
        return;
    }
    int mid=l+r>>1;
    build(ls,l,mid),build(rs,mid+1,r);
    updata(id);
}
int query(int id,int L,int R,int l,int r)
{
    if(l==L&&r==R) return mx[id];
    pushdown(id);
    int Mid=L+R>>1;
    if(r<=Mid) return query(ls,L,Mid,l,r);
    else if(l>Mid) return query(rs,Mid+1,R,l,r);
    else return max(query(ls,L,Mid,l,Mid),query(rs,Mid+1,R,Mid+1,r));
}
int hisquery(int id,int L,int R,int l,int r)
{
    if(l==L&&r==R) return hismx[id];
    pushdown(id);
    int Mid=L+R>>1;
    if(r<=Mid) return hisquery(ls,L,Mid,l,r);
    else if(l>Mid) return hisquery(rs,Mid+1,R,l,r);
    else return max(hisquery(ls,L,Mid,l,Mid),hisquery(rs,Mid+1,R,Mid+1,r));
}
void change(int id,int L,int R,int l,int r,koito_yuu d)
{
    if(l==L&&r==R)
    {
        hismx[id]=max(hismx[id],d+mx[id]);
        histag[id].upt(tag[id]+d);
        mx[id]=d+mx[id];
        tag[id]=tag[id]+d;
        return;
    }
    pushdown(id);
    int Mid=L+R>>1;
    if(r<=Mid) change(ls,L,Mid,l,r,d);
    else if(l>Mid) change(rs,Mid+1,R,l,r,d);
    else change(ls,L,Mid,l,Mid,d),change(rs,Mid+1,R,Mid+1,r,d);
    updata(id);
}
int main()
{
    read(n);
    for(int i=1;i<=n;i++) read(a[i]);
    build(1,1,n);
    read(m);
    char op[4];
    for(int l,r,x,i=1;i<=m;i++)
    {
        scanf("%s",op);
        read(l),read(r);
        if(op[0]=='Q') printf("%d\n",query(1,1,n,l,r));
        else if(op[0]=='A') printf("%d\n",hisquery(1,1,n,l,r));
        else if(op[0]=='P')
        {
            read(x);
            change(1,1,n,l,r,koito_yuu(x,-inf));
        }
        else
        {
            read(x);
            change(1,1,n,l,r,koito_yuu(-inf,x));
        }
    }
    return 0;
}


2019.3.21

原文地址:https://www.cnblogs.com/butterflydew/p/10574650.html

时间: 2024-10-11 04:14:42

CPU监控 解题报告的相关文章

解题报告 之 POJ3469 Dual Core CPU

解题报告 之 POJ3469 Dual Core CPU Description As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft Corporation, decided to update their famous product - SWODNIW. The routine consists of N modules,

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

[补档][Tyvj 1518]CPU监控

题目 Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用鼠标乱点之类的事,甚至会一脚踢掉电源--这些事有的会让做这件事的这段时间内CPU使用率增加或减少一个值:有的事还会直接让CPU使用率变为一个值. 当然Bob会询问:在之前给出的事件影响下,CPU在某段时间内,使用率最高是多少.有时候Bob还会好奇地询问,在某段时间内CPU曾经的最高使用率是多少. 为了使计

第五届蓝桥杯软件大赛C/C++本科B组决赛解题报告

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

[LeetCode]LRU Cache, 解题报告

题目 Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set. get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.

USACO Section1.3 Wormholes 解题报告

wormhole解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 一个人在二维坐标系上走,方向永远是+x.此坐标系中有N个虫洞(N是偶数). 虫洞这东西,一旦两个配成一对,便可以形成“传送门

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做