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

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

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

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

  2. USACO Section1.3 Wormholes 解题报告

    wormhole解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------- ...

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

    2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...

  4. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

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

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

  6. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  7. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  8. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  9. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

随机推荐

  1. Hive基础

    一.常用语句 二.嵌套语句 以上两句的查询结果相同. 三.关键字查询

  2. JEECG 不同(角色的)人对同样的字段数据,使用不同的字段验证规则

    JEECG智能开发平台v3 开发指南http://www.jeecg.org/book/jeecg_v3.html jeecg: JEECG是一款基于代码生成器的J2EE快速开发平台,开源界“小普元” ...

  3. Oracle SQL优化原则

    原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...

  4. MySQL Limit优化(转)

    原文:http://bbs.landingbj.com/t-0-240894-1.html 首先,我们看一个分页SQL: SELECT time,pageFROM `l_not_200_page`WH ...

  5. 理解npm、nvm、nodejs之间的关系

    nvm nvm:nodeJs版本管理工具,管理nodejs版本和npm版本,使用nvm安装nodejs时会将npm一起安装下来 nodejs nodeJs: 一种高效的JavaScript运行环境 n ...

  6. spark-shell简单使用介绍(scala)

    >>提君博客原创  http://www.cnblogs.com/tijun/  << 提君博客原创 1.进入命令窗口 ./bin/spark-shell 附上帮助指令,查看一 ...

  7. 剑指offer(13)

    题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 判断当前两个根结点是否相等,如果相等,判断左右子树是否相等,如果不依次判断左右子树是否满足上 ...

  8. hashCode和equals的关系分析

    hashCode:说白了,简单的就看做一个函数,但是该函数有可能出现:对于某个x值,存在不止一个y值与之对应.这种情况就叫哈希碰撞. 那么: 1.如果hashCode相等,两个对象不一定是同一个对象( ...

  9. python3 写的一个压测脚本(有待开发)

    import requests import queue import threading import time status_code_list = [] exec_time = 0 class ...

  10. 莫烦sklearn学习自修第九天【过拟合问题处理】

    1. 过拟合问题可以通过调整机器学习的参数来完成,比如sklearn中通过调节gamma参数,将训练损失和测试损失降到最低 2. 代码实现(显示gamma参数对训练损失和测试损失的影响) from _ ...