bzoj3064 CPU监控

今天终于写了一道正常的题
思路是这样的:
1.普通线段树add,set不变,并改为下放标记版本
2.past_addv 记录一个区间内可能的addv值的最大值
3.past_setv 记录一个区间被set的最大值
4.maxv与past_maxv为值
代码风格导致比较长
#include<cstdio>
#include<climits>
#include<cctype>
#include<algorithm> using std :: max ; const int MAXN = * + ;
const int NONE = INT_MIN ;
int N ; void max_equal ( int & a , const int b ) {
if ( b > a ) a = b ;
} int get_int () {
int v ;
scanf ( "%d" , & v ) ;
return v ;
} int addv [ MAXN * ] ;
int setv [ MAXN * ] ;
int maxv [ MAXN * ] ; int past_addv [ MAXN * ] ;
int past_setv [ MAXN * ] ;
int past_maxv [ MAXN * ] ; void M_add ( const int o , const int v ) {
if ( setv [ o ] != NONE ) {
setv [ o ] += v ; max_equal ( past_setv [ o ] , setv [ o ] ) ;
} else {
addv [ o ] += v ; max_equal ( past_addv [ o ] , addv [ o ] ) ;
}
} void M_set ( const int o , const int v ) {
setv [ o ] = v ; max_equal ( past_setv [ o ] , setv [ o ] ) ;
} void P_add ( const int o , const int v ) {
if ( setv [ o ] != NONE ) {
max_equal ( past_setv [ o ] , setv [ o ] + v ) ;
} else {
max_equal ( past_addv [ o ] , addv [ o ] + v ) ;
}
} void P_set ( const int o , const int v ) {
max_equal ( past_setv [ o ] , v ) ;
} void push_down ( const int o ) {
const int o1 = o << ;
const int o2 = o << | ;
if ( past_addv [ o ] ) {
P_add ( o1 , past_addv [ o ] ) ;
P_add ( o2 , past_addv [ o ] ) ;
past_addv [ o ] = ;
}
if ( addv [ o ] ) {
M_add ( o1 , addv [ o ] ) ;
M_add ( o2 , addv [ o ] ) ;
addv [ o ] = ;
}
if ( past_setv [ o ] != NONE ) {
P_set ( o1 , past_setv [ o ] ) ;
P_set ( o2 , past_setv [ o ] ) ;
past_setv [ o ] = NONE ;
}
if ( setv [ o ] != NONE ) {
M_set ( o1 , setv [ o ] ) ;
M_set ( o2 , setv [ o ] ) ;
setv [ o ] = NONE ;
}
} void maintain ( const int o , const int L , const int R ) {
const int o1 = o << ;
const int o2 = o << | ;
if ( R - L == ) {
maxv [ o ] = setv [ o ] ;
max_equal ( past_maxv [ o ] , past_setv [ o ] ) ;
} else {
maxv [ o ] =
( setv [ o ] == NONE ) ? max ( maxv [ o1 ] , maxv [ o2 ] ) + addv [ o ] : setv [ o ] ;
max_equal ( past_maxv [ o ] , past_setv [ o ] ) ;
max_equal ( past_maxv [ o ] , max ( maxv [ o1 ] , maxv [ o2 ] ) + past_addv [ o ] ) ;
max_equal ( past_maxv [ o ] , max ( past_maxv [ o1 ] , past_maxv [ o2 ] ) ) ;
}
} static struct {
void W ( const int o , const int L , const int R ) {
setv [ o ] = past_setv [ o ] = maxv [ o ] = past_maxv [ o ] = NONE ;
addv [ o ] = past_addv [ o ] = ;
if ( R - L == ) {
M_set ( o , get_int () ) ;
} else {
const int M = ( L + R ) >> ;
W ( o << , L , M ) ;
W ( o << | , M , R ) ;
}
maintain ( o , L , R ) ;
}
void operator ( ) ( ) {
scanf ( "%d" , & N ) ;
W ( , , N + ) ;
}
} Build ; static struct {
int l , r , v ;
void W ( const int o , const int L , const int R ) {
if ( l <= L && R <= r ) {
M_set ( o , v ) ;
} else {
const int M = ( L + R ) >> ;
push_down ( o ) ;
if ( l < M ) W ( o << , L , M ) ; else maintain ( o << , L , M ) ;
if ( M < r ) W ( o << | , M , R ) ; else maintain ( o << | , M , R ) ;
}
maintain ( o , L , R ) ;
}
void operator () ( const int L , const int R , const int V ) {
l = L ; r = R + ; v = V ;
W ( , , N + ) ;
}
} Set ; static struct {
int l , r , v ;
void W ( const int o , const int L , const int R ) {
if ( l <= L && R <= r ) {
M_add ( o , v ) ;
} else {
const int M = ( L + R ) >> ;
push_down ( o ) ;
if ( l < M ) W ( o << , L , M ) ; else maintain ( o << , L , M ) ;
if ( M < r ) W ( o << | , M , R ) ; else maintain ( o << | , M , R ) ;
}
maintain ( o , L , R ) ;
}
void operator () ( const int L , const int R , const int V ) {
l = L ; r = R + ; v = V ;
W ( , , N + ) ;
}
} Add ; static struct {
int l , r , ans ;
void W ( const int o , const int L , const int R ) {
if ( l <= L && R <= r ) {
max_equal ( ans , maxv [ o ] ) ;
} else {
const int M = ( L + R ) >> ;
push_down ( o ) ;
maintain ( o << , L , M ) ;
maintain ( o << | , M , R ) ;
if ( l < M ) W ( o << , L , M ) ;
if ( M < r ) W ( o << | , M , R ) ;
}
}
int operator () ( const int L , const int R ) {
l = L ; r = R + ; ans = NONE ;
W ( , , N + ) ;
return ans ;
}
} Qmax ; static struct {
int l , r , ans ;
void W ( const int o , const int L , const int R ) {
if ( l <= L && R <= r ) {
max_equal ( ans , past_maxv [ o ] ) ;
} else {
const int M = ( L + R ) >> ;
push_down ( o ) ;
maintain ( o << , L , M ) ;
maintain ( o << | , M , R ) ;
if ( l < M ) W ( o << , L , M ) ;
if ( M < r ) W ( o << | , M , R ) ;
}
}
int operator () ( const int L , const int R ) {
l = L ; r = R + ; ans = NONE ;
W ( , , N + ) ;
return ans ;
}
} Q_past_max ; int T , E , opt , X , Y , Z ;
int main () {
Build ( ) ;
scanf ( "%d" , & E ) ;
while ( E -- ) {
while ( isspace ( opt = getchar () ) ) ;
switch ( opt ) {
case 'Q' :
scanf ( "%d%d" , & X , & Y ) ;
printf ( "%d\n" , Qmax ( X , Y ) ) ;
break ;
case 'A' :
scanf ( "%d%d" , & X , & Y ) ;
printf ( "%d\n" , Q_past_max ( X , Y ) ) ;
break ;
case 'P' :
scanf ( "%d%d%d" , & X , & Y , & Z ) ;
Add ( X , Y , Z ) ;
break ;
case 'C' :
scanf ( "%d%d%d" , & X , & Y , & Z ) ;
Set ( X , Y , Z ) ;
break ;
}
}
return ;
}
bzoj3064 CPU监控的更多相关文章
- 【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 ...
随机推荐
- LINUX下的MYSQL默认表名区分大小写
让MYSQL不区分表名大小写的方法其实很简单: 1.用ROOT登录,修改/etc/my.cnf,该文件的路径也可能是/usr/my.cnf. 2.加入一行:lower_case_table_names ...
- HDU 4648 Magic Pen 6 思路
官方题解: 题意转化一下就是: 给出一列数a[1]...a[n],求长度最长的一段连续的数,使得这些数的和能被M整除. 分析: 设这列数前i项和为s[i], 则一段连续的数的和 a[i]+a[i+1] ...
- eclipse中servers(服务器)的配置
eclipse中servers(服务器)的配置 使用eclipse+tomcat时,很多人喜欢安装tomcat插件,以便一键启动tomcat,但我不喜欢给eclipse安装一些非必须的插件,而ecli ...
- CCNU-线段树练习题-A-单点更新1
A - 单点更新1 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- msmq中消息的数量
using System.Diagnostics; PerformanceCounter objCounter = new PerformanceCounter("MSMQ Queue&qu ...
- Linux同步机制(二) - 条件变量,信号量,文件锁,栅栏
1 条件变量 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足. 1.1 相关函数 #include <pthread.h> pthread_cond_t cond ...
- phpcms上线步骤,无法生成缓存,页面空白原因
缓存目录没有设置成777. 1.修改数据库配置 2.修改数据表中的本地地址成线上地址 3.修改代码中的配置,本地地址批量改为线上地址 4.登录后台,更新缓存
- 如何停止Android Monkey脚本
如何停止Android Monkey脚本 最近用monkey来包apk的性能测试,发现一旦monkey跑起来以后,即使将数据线和PC断开,monkey脚本还是会继续运行下去.结果找到了一个办法去停止它 ...
- mysql中sql语句执行时间
delimiter // set @d=now(); select * from comment; select timestampdiff(second,@d,now()); delimiter ; ...
- Linux进程控制(二)
1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h&g ...