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

思路是这样的:

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. 给 Gradle 配置国内的 Maven 仓库,提高 jar 包下载速度。

    最近使用 gradle 跑一些 spring 的示例,在下载一些 jar 的时候速度特别慢,因为是访问的国外的 maven 仓库. 开源中国提供了国内的 maven 库,所以可以在 gradle 里设 ...

  2. 《大道至简-Team》

    已经学习了<大道至简>两章,我们了解了编程的本质和“懒人”造就了方法.书中没有提供给我们编程的技巧,捷径,而是从别的方面为我们讲解了编程的精义.第三章就为我们引入了“团队”这个概念. 我们 ...

  3. Hibernate 中update hql语句

    今天在MySQL中用hibernate测试update语句发现以下问题: update语句竟然不去作用: 表机构如下: create table student(sid int primary key ...

  4. UML类图几种关系的总结,泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

    在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Compositi ...

  5. 在HibernateTemplate里执行Sql语句

    如下所示只能执行非Select语句: public static void executeSQL(HibernateTemplate hibernateTemplate, String sql) { ...

  6. Bootstrap_CSS全局样式

    一.HTML5 文档类型 Bootstrap 使用到的某些 HTML 元素和 CSS 属性需要将页面设置为 HTML5 文档类型.在你项目中的每个页面都要参照下面的格式进行设置. <!DOCTY ...

  7. 深入.NET平台和C#编程 错题录

    1.在C#中,关于文件操作相关的类说法正确的是(AB) <选择二项> A:FileInfo类提供了用于操作文件的实例方法 B:File类提供了用于操作文件的静态方法 C:Directory ...

  8. short s1 = 1; s1 = s1 + 1;和 s1 += 1;

    对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误. 对于shor ...

  9. [xUnix 开发环境--01] MAMP mac os 10.10 配置经历、要点——01. phpmyadmin连不上

    Mac OS 10.10已经自带了apache2和php(php的路径我至今还没不知道,太懒没去找) 用brew安装mysql, 在官网上下载了phpmyadmin,按官方方式配置完后,登录不上,也不 ...

  10. poj 1465 Multiple(bfs+余数判重)

    题意:给出m个数字,要求组合成能够被n整除的最小十进制数. 分析:用到了余数判重,在这里我详细的解释了.其它就没有什么了. #include<cstdio> #include<cma ...