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

思路是这样的:

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. 从一个前端项目实践 Git flow 的流程与参考

    Git flow 出自 A successful Git branching model,这里使用了一个前端项目配合本文稿实施了 git flow 并记录流程作出示例和参考,对 hotfix 与持续部 ...

  2. 基于Theano的DNN框架Blocks使用简要总结

    Blocks官方代码地址:https://github.com/mila-udem/blocks Blocks是加拿大Montreal大学Bengio实验室牵头开发的基于Python的神经网络模型框架 ...

  3. Git查看、删除、重命名远程分支和tag【转】

    转自:http://zengrong.net/post/1746.htm 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也 ...

  4. Asterisk的配置详解

    Asterisk的配置文件都在/etc/asterisk目录下,重要的配置文件有: sip.conf                      sip电话基本配置 extensions.conf    ...

  5. sgen.exe" exited with code 1.解决方法

    VS中有时候编译项目会出现这样的错误: 错误   "sgen.exe" exited with code 1.即(错误   “sgen.exe”已退出,代码为 1.) 解决办法: ...

  6. MTK android flash配置

    关于6573集成MCP nandflash的方法,driver_allinone 和Memory Customer Document pdf的说明里面漏了很多细节.在此补上. 1.首先确认flash型 ...

  7. JavaScript 高级篇之闭包、模拟类,继承(五)

    本篇主要分享我对闭包的理解及使用闭包完成私有属性.模拟类.继承等,结合大量例子,希望大家能快速掌握!首先让我们先从一些基本的术语开始吧     一.javascript中的闭包 1.我们一起先来理解什 ...

  8. Jquery-json

    第三方插件: jquery.json-2.4.js Jquery-json 是 jQuery 的一个插件,可轻松实现对象和 JSON 字符串之间的转换.可序列化 JavaScript 对象.数值.字符 ...

  9. ural1238. Folding(记忆化)

    1238 这算模拟加记忆化吗 找bug找了2个多小时..记忆化部分好想 就是字符串处理部分挫了 一个个复制模拟 各种修改查找 #include <iostream> #include< ...

  10. CodeForces 378C Maze (DFS)

    题目链接 题意:给一个由“.”组成的联通区域,求再添加k个‘#'以后还是联通区域的方案. 分析:做题的时候犯二了,用DFS,一直搜到边缘,然后从边缘依次往回 回溯,回溯的过程中填充’#‘ 一直填充k个 ...