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. 实验楼----PHP大法

    地址:http://www.shiyanbar.com/ctf/2008 题目:http://ctf5.shiyanbar.com/DUTCTF/index.php

  2. jmeter 启动jmeter-server.bat远程调用报错: java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)

    1.找到apache-jmeter-5.0\bin\jmeter.properties 2.修改server.rmi.ssl.disable=true (记得去除server.rmi.ssl.disa ...

  3. JSON for-in 遍历

    (代码均以js代码示例) 1.可以使用 for-in 来循环对象的属性,使用中括号([])来访问属性的值: 这中方法便于一些在不确定有属性的情况下使用. var myObj = { "nam ...

  4. Java 简单的登录验证码

    1 验证码的作用 验证码是为了区分人与机器,如果没有验证码机制,web网站或者应用会遇到很多问题,具体如下: ① 网站容易被暴力登录攻破密码,可以制作一个自动程序不断的尝试登录,密码很容易被破解,系统 ...

  5. Kafka-Flume-elasticsearch

    a1.sources = kafkaSource a1.channels = memoryChannel a1.sinks = elasticsearch a1.sources.kafkaSource ...

  6. 大白跟着“菜鸟”学node——同名事件

    若存在两个同名事件,触发事件时,两个事件监听器的回调函数会被按次序先后调用. 实例来自菜鸟教程: var events=require('events'); var emitter=new event ...

  7. python之路--初识面向对象

    一 . 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大 ...

  8. 一、IntelliJ IDEA创建java项目

    一.IntelliJ IDEA创建java项目 二.IntelliJ IDEA下载并包含jdbc包 1.下载zip格式的驱动包:https://dev.mysql.com/downloads/conn ...

  9. 四、Mysql主从同步

    一.MySQL Replication介绍 MySQL Replication 官方文档 Replication可以实现将数据从一台数据库服务器(master)复制到一或多台数据库服务器(slave) ...

  10. 关于PHP函数传参的注意点

    PHP的实参在传递过程中是顺序传递的,不支持指定参数名传递.怎么理解呢?看下面的代码: function test($name,$age){ echo '姓名:'.$name,' 年纪:'.$age; ...