BZOJ 3064 CPU监控
题目链接:CPU监控
学习一番线段树的历史标记~
这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值。
然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标记。然后下传标记的时候注意要先传历史标记再传现在的标记。
王队告诉我说,关于历史标记,可以理解成每个节点有过很多标记,可以看成每个节点都有一个标记队列。这样的话,现在的标记就是在维护这个队列的最后一个,历史标记就是这个队列的\(max\)。所以传标记的时候需要先下传历史标记。
一定要把各种标记想清楚了再写。
下面贴代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define INF (-2147483647)
#define maxn 100010 using namespace std;
typedef long long llg; int n,m,L,R,_nm,_pm,z,_;
int nmax[maxn<<2],nadd[maxn<<2],ncov[maxn<<2];//现在的标记
int pmax[maxn<<2],padd[maxn<<2],pcov[maxn<<2];//历史标记 int getint(){
int w=0;bool q=0;
char c=getchar();
while((c>'9'||c<'0')&&c!='-') c=getchar();
if(c=='-') c=getchar(),q=1;
while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar();
return q?-w:w;
} void update(int u){
nmax[u]=max(nmax[u<<1],nmax[u<<1|1]);
pmax[u]=max(pmax[u<<1],pmax[u<<1|1]);
} void pushdown(int u){
for(int i=0,v;i<2;i++){
v=u<<1|i;
pmax[v]=max(pmax[v],nmax[v]+padd[u]);
pmax[v]=max(pmax[v],pcov[u]);
if(ncov[v]==INF) padd[v]=max(padd[v],nadd[v]+padd[u]);
else pcov[v]=max(pcov[v],ncov[v]+padd[u]);
if(nadd[u]){
nmax[v]+=nadd[u];
if(ncov[v]==INF) nadd[v]+=nadd[u];
else ncov[v]+=nadd[u];
}
if(ncov[u]!=INF){
nmax[v]=ncov[u];
ncov[v]=ncov[u]; nadd[v]=0;
pcov[v]=max(pcov[v],pcov[u]);
}
}
padd[u]=nadd[u]=0,pcov[u]=ncov[u]=INF;
} void build(int u,int l,int r){
pcov[u]=ncov[u]=INF;
int lc=u<<1,lv=u<<1|1,mid=(l+r)>>1;
if(l==r) nmax[u]=pmax[u]=getint();
else build(lc,l,mid),build(lv,mid+1,r),update(u);
} void query(int u,int l,int r){
if(l!=r) pushdown(u);
if(l>=L && r<=R) _nm=max(_nm,nmax[u]),_pm=max(_pm,pmax[u]);
else{
int mid=(l+r)>>1;
if(L<=mid) query(u<<1,l,mid);
if(R>mid) query(u<<1|1,mid+1,r);
}
} void add(int u,int l,int r){
if(l!=r) pushdown(u);
if(l>=L && r<=R)
if(_) padd[u]=nadd[u]=z,pmax[u]=max(pmax[u],nmax[u]+=z);
else pcov[u]=ncov[u]=z,pmax[u]=max(pmax[u],nmax[u]=z);
else{
int mid=(l+r)>>1;
if(L<=mid) add(u<<1,l,mid);
if(R>mid) add(u<<1|1,mid+1,r);
update(u);
}
} int main(){
File("a");
n=getint(),build(1,1,n);
m=getint(); char c;
while(m--){
c=getchar();
while(c!='A' && c!='Q' && c!='P' && c!='C') c=getchar();
L=getint(); R=getint();
if(c=='Q' || c=='A'){
_nm=_pm=INF; query(1,1,n);
printf("%d\n",c=='Q'?_nm:_pm);
}
else{
z=getint(); _=c=='P';
add(1,1,n);
}
}
return 0;
}
BZOJ 3064 CPU监控的更多相关文章
- BZOJ.3064.CPU监控(线段树 历史最值)
题目链接 \(Description\) 有一个长为n的序列Ai,要求支持查询[l,r]的最值.历史最值,区间加/重设 \(Solution\) 线段树,每个点再维护一个历史(从0到现在)最大值.历史 ...
- 【BZOJ3064】CPU监控(线段树)
[BZOJ3064]CPU监控(线段树) 题面 BZOJ 洛谷 题解 神仙\(zsy\)出在了\(noip\)模拟的题目.(然而\(zsy\)出的还是这题的升级版) 首先明确一点,这题是一个吉司机线段 ...
- C#实现对远程服务器的内存和CPU监控
C#实现对远程服务器的内存和CPU监控小记 1. 主要使用到的组件有System.Management.dll 2. 主要类为 :ManagementScope 连接远程服务器示例代码: priv ...
- Linux CPU监控指标
Linux CPU监控指标 Linux提供了非常丰富的命令可以进行CPU相关数据进行监控,例如:top.vmstat等命令.top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执 ...
- [补档][Tyvj 1518]CPU监控
[Tyvj 1518]CPU监控 题目 Bob需要一个程序来监视CPU使用率.这是一个很繁琐的过程,为了让问题更加简单,Bob会慢慢列出今天会在用计算机时做什么事. Bob会干很多事,除了跑暴力程序看 ...
- CPU监控 解题报告
CPU监控 这种题就需要小黄鸭调试法,不行就重构,动态gdb可能会死人,一堆tag的... 维护历史最值的一个核心是历史最值tag,它的意义是从上一次这个点下放tag之后到当前时刻的这个点的tag达到 ...
- 安卓app测试之cpu监控
安卓app测试之cpu监控,如何获取监控的cpu数据呢? 一.通过Dumpsys 来取值 1.adb shell dumpsys cpuinfo 二.top 1.top -d 1|grep packa ...
- 轻量级监控平台之cpu监控
轻量级监控平台之cpu监控脚本 #!/bin/bash #进程监控脚本 #功能需求: 上报机器的硬件层面-cpu负载数据 . /etc/profile . ~/.bash_profile pushur ...
- [BZOJ3064][Tyvj1518] CPU监控
题目:[BZOJ3064][Tyvj1518] CPU监控 思路: 线段树专题讲的.以下为讲课时的课件: 给出序列,要求查询一些区间的最大值.历史最大值,支持区间加.区间修改.序列长度和操作数< ...
随机推荐
- 实用的IOS应用程序框架
实用的IOS应用程序框架 目录 概述 概述
- C++ 初始化函数的实现
http://www.cppblog.com/xlshcn/archive/2007/11/21/37088.aspx
- Thrift 入门之helloWorld
不多说,先看项目结构 首先先编写一个hello.thrift的文件 hello.thrift namespace java sawshaw service HelloService { string ...
- svn-maven-tomcat自动发布脚本
#!/bin/sh #svn-maven-tomcat自动发布脚本 #变量设置 svnpath=svn://10.60.10.120/研发部/xx-maven svnusername=xxx svnp ...
- 解决pip install 安装慢问题
使用豆瓣源 比如安装pyspark pip install -i https://pypi.douban.com/simple/ pyspark 速度就比用pip install快N倍 关注公众号:
- Oracle数据库类型date
date日期类型 说明 oracle dd-mm-yyyy create table test1(birthday date); timestamp(n) 说明:邮戳的时间类型 于date的区别,邮戳 ...
- CodeForeces 25E (kmp)
E. Test time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputst ...
- talib 中文文档(十四):Math Transform Functions 数学变换
Math Transform Functions ACOS - Vector Trigonometric ACos 函数名:ACOS 名称:acos函数是反余弦函数,三角函数 real = ACOS( ...
- Python开发【Django】:Form组件
Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...
- 【Loadrunner】使用LoadRunner上传及下载文件
使用LoadRunner上传及下载文件 1)LoadRunner上传文件 web_submit_data("importStudent.do", "Action=http ...