今天终于写了一道正常的题

思路是这样的:

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监控的更多相关文章

  1. 【BZOJ3064】CPU监控(线段树)

    [BZOJ3064]CPU监控(线段树) 题面 BZOJ 洛谷 题解 神仙\(zsy\)出在了\(noip\)模拟的题目.(然而\(zsy\)出的还是这题的升级版) 首先明确一点,这题是一个吉司机线段 ...

  2. [BZOJ3064][Tyvj1518] CPU监控

    题目:[BZOJ3064][Tyvj1518] CPU监控 思路: 线段树专题讲的.以下为讲课时的课件: 给出序列,要求查询一些区间的最大值.历史最大值,支持区间加.区间修改.序列长度和操作数< ...

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

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

  4. Linux CPU监控指标

    Linux CPU监控指标 Linux提供了非常丰富的命令可以进行CPU相关数据进行监控,例如:top.vmstat等命令.top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执 ...

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

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

  6. CPU监控 解题报告

    CPU监控 这种题就需要小黄鸭调试法,不行就重构,动态gdb可能会死人,一堆tag的... 维护历史最值的一个核心是历史最值tag,它的意义是从上一次这个点下放tag之后到当前时刻的这个点的tag达到 ...

  7. BZOJ 3064 CPU监控

    题目链接:CPU监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...

  8. 安卓app测试之cpu监控

    安卓app测试之cpu监控,如何获取监控的cpu数据呢? 一.通过Dumpsys 来取值 1.adb shell dumpsys cpuinfo 二.top 1.top -d 1|grep packa ...

  9. 轻量级监控平台之cpu监控

    轻量级监控平台之cpu监控脚本 #!/bin/bash #进程监控脚本 #功能需求: 上报机器的硬件层面-cpu负载数据 . /etc/profile . ~/.bash_profile pushur ...

随机推荐

  1. iOS:分割控制器UISplitViewcontroller

    分割控制器UISplitViewController <1>功能:它也是ipad的一个新特性,在屏幕上可以同时显示两个控制器,左边一个,右边一个:左边的为主控制器,右边的为详细控制器,主控 ...

  2. Spring AOP术语

    1.AOP术语     1)连接点(Joinpoint)     程序执行的某个特定位置:如类开始初始化前.类初始化后.类某个方法调用前.调用后.方法抛出异常后.一个类或一段程序代码拥有一些具有边界性 ...

  3. Eclipse中遇到The type XXX cannot be resolved. It is indirectly referenced from required .class files错误

    原因:某个项目需要的jar包没有导入 参考文章:http://www.blogjava.net/zJun/archive/2007/10/16/153374.html

  4. python中写shell(转)

    python中写shell,亲测可用,转自stackoverflow To run a bash script, copy from stackoverflow def run_script(scri ...

  5. 【原创】通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错 ...

  6. 二维码工具类 - QrcodeUtils.java

    二维码工具类,提供多种生成二维码.解析二维码的方法,包括中间logo的二维码等方法. 源码如下:(点击下载 - QrcodeUtils.java.MatrixToImageWriterEx.java. ...

  7. [HIHO1041]国庆出游(DFS, bitset)

    题目链接:http://hihocoder.com/problemset/problem/1041 学会了用C++的bitset哈,可喜可贺.以后遇到超过64位想用位来表示状态就不愁了哈. 这题用bi ...

  8. How to use 'crontab' command on bitnami

    You can edit the cron file using the following command: $ sudo crontab -e You can add a new line lik ...

  9. BZOJ3674: 可持久化并查集加强版

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题解:主要是可持久化的思想.膜拜了一下hzwer的代码后懂了. 其实本质是可持久化fa数 ...

  10. C++实现顺序表

    #include<iostream>using namespace std; typedef int DataType; class SeqList{public:    SeqList( ...