【bzoj3064】 CPU监控
http://www.lydsy.com/JudgeOnline/problem.php?id=3064 (题目链接)
题意
给出一个长度为$n$的数列$A$,同时定义一个辅助数组$B$,$B$开始与$A$完全相同。接下来进行$m$次操作, 有4种类型:
- 区间加法
- 区间覆盖
- 查询$A$的区间最值
- 查询$B$的区间最值
Solution
参考吉利论文。
最恶心的就是覆盖标记和加减标记的合并= =,一定要想清楚所有情况。
细节
代码略丑= =
代码
// bzoj3938
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<30)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
int n,m,a[maxn];
char ch[100];
struct node {int l,r,nadd,padd,ncov,pcov,nmx,pmx;}tr[maxn<<2]; void pushup(int k) {
tr[k].nmx=max(tr[k<<1].nmx,tr[k<<1|1].nmx);
tr[k].pmx=max(tr[k<<1].pmx,tr[k<<1|1].pmx);
}
void pushdown(int k) {
for (int x,i=0;x=k<<1|i,i<2;i++) {
tr[x].pmx=max(tr[x].pmx,max(tr[k].padd+tr[x].nmx,tr[k].pcov));
if (tr[k].ncov==-inf) {
tr[x].nmx+=tr[k].nadd;
if (tr[x].ncov==-inf) tr[x].padd=max(tr[x].padd,tr[x].nadd+tr[k].padd),tr[x].nadd+=tr[k].nadd;
else tr[x].pcov=max(tr[x].pcov,tr[x].ncov+tr[k].padd),tr[x].ncov=tr[x].nmx;
}
else {
if (tr[x].ncov==-inf) tr[x].padd=max(tr[x].padd,tr[x].nadd+tr[k].padd);
else tr[x].pcov=max(tr[x].pcov,tr[x].nmx+tr[k].padd);
tr[x].nmx=tr[x].ncov=tr[k].ncov,tr[x].pcov=max(tr[x].pcov,tr[k].pcov);
}
}
tr[k].ncov=tr[k].pcov=-inf;tr[k].nadd=tr[k].padd=0;
}
void build(int k,int s,int t) {
tr[k].l=s;tr[k].r=t;
tr[k].ncov=tr[k].pcov=-inf;
if (s==t) {tr[k].nmx=tr[k].pmx=a[s];return;}
int mid=(s+t)>>1;
build(k<<1,s,mid);
build(k<<1|1,mid+1,t);
pushup(k);
}
int query(int k,int s,int t,int op) {
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;
if (l==s && r==t) return op ? tr[k].pmx : tr[k].nmx;
pushdown(k);
if (t<=mid) return query(k<<1,s,t,op);
else if (s>mid) return query(k<<1|1,s,t,op);
else return max(query(k<<1,s,mid,op),query(k<<1|1,mid+1,t,op));
}
void modify(int k,int s,int t,int val,int op) {
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;
if (l==s && r==t) {
if (op) {
tr[k].pmx=max(tr[k].pmx,tr[k].nmx=val);
tr[k].pcov=max(tr[k].pcov,tr[k].ncov=val);
}
else {
tr[k].pmx=max(tr[k].pmx,tr[k].nmx+=val);
if (tr[k].ncov==-inf) tr[k].padd=max(tr[k].padd,tr[k].nadd+=val);
else tr[k].pcov=max(tr[k].pcov,tr[k].ncov=tr[k].nmx);
}
return;
}
pushdown(k);
if (t<=mid) modify(k<<1,s,t,val,op);
else if (s>mid) modify(k<<1|1,s,t,val,op);
else modify(k<<1,s,mid,val,op),modify(k<<1|1,mid+1,t,val,op);
pushup(k);
}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
scanf("%d",&m);
for (int x,y,z,i=1;i<=m;i++) {
scanf("%s%d%d",ch,&x,&y);
if (ch[0]=='Q') printf("%d\n",query(1,x,y,0));
if (ch[0]=='A') printf("%d\n",query(1,x,y,1));
if (ch[0]=='P') scanf("%d",&z),modify(1,x,y,z,0);
if (ch[0]=='C') scanf("%d",&z),modify(1,x,y,z,1);
}
return 0;
}
【bzoj3064】 CPU监控的更多相关文章
- bzoj3064 CPU监控
今天终于写了一道正常的题 思路是这样的: 1.普通线段树add,set不变,并改为下放标记版本 2.past_addv 记录一个区间内可能的addv值的最大值 3.past_setv 记录一个区间被s ...
- 【BZOJ3064】CPU监控(线段树)
[BZOJ3064]CPU监控(线段树) 题面 BZOJ 洛谷 题解 神仙\(zsy\)出在了\(noip\)模拟的题目.(然而\(zsy\)出的还是这题的升级版) 首先明确一点,这题是一个吉司机线段 ...
- [BZOJ3064][Tyvj1518] CPU监控
题目:[BZOJ3064][Tyvj1518] CPU监控 思路: 线段树专题讲的.以下为讲课时的课件: 给出序列,要求查询一些区间的最大值.历史最大值,支持区间加.区间修改.序列长度和操作数< ...
- 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达到 ...
- BZOJ 3064 CPU监控
题目链接:CPU监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...
- 安卓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 ...
随机推荐
- k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)
来源:, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, ...
- java 基础01
标识符:字母,下划线和美元符号,数字组成大小写敏感,无长度限制 关键字: 数据类型
- 基于uFUN开发板的心率计(三)Qt上位机的实现
前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...
- macaca使用中问题解决方法整理
报告老板:很多同学在搭建macaca的环境时候,出现了各种问题,尤其是使用windows的同学,更是复杂且费劲的要命,我这里针对一些遇到的坑,按照从头的搭建开始说起,如下 基本的搭建条件要满足基础环境 ...
- Linux下防御DDOS攻击的操作梳理
DDOS的全称是Distributed Denial of Service,即"分布式拒绝服务攻击",是指击者利用大量“肉鸡”对攻击目标发动大量的正常或非正常请求.耗尽目标主机资源 ...
- Node 系列之url模块
引入 url: const url = require("url"); 用于URL解析.处理等操作的解决方案 1.url.parse(urlStr[, parseQueryStri ...
- 个人博客作业Week2 是否需要有代码规范
问题:是否需要有代码规范 对于是否需要有代码规范,请考虑下列论点并反驳/支持: 1.这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 2.我是个艺术家,手艺人,我有 ...
- linux内核分析第二四学习报告
学生 黎静 课程内容 计算机三大法宝 • 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: • 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那 ...
- myeclipse快捷方式汇总
选择你要注释的那一行或多行代码,按Ctrl+/即可,取消注释也是选中之后按Ctrl+/即可. 如果你想使用的快捷键的注释是的话,那么你的快捷键是ctrl+shift+/我以前都是手动注释的,直接打// ...
- 关于QQ的NABCD模型
关于QQ的NABCD模型 N--Need 随着电脑的普及,人们在网络上进行交流的时间越来越多,由于现有的交流工具还不是那么的完善,还不能够完全满足人们在交流时的需求.因此为了满足人们更多的需求,我们设 ...