题目链接:戳我

比较神仙的一个题(至少对于我这个小蒟蒻来说。。。)下面尽可能详细地解释一下吧。。。学习来源:这位神仙的题解

其实就是对于操作的转换。我们设(x,y)为操作的参数,设当前数为a,操作为max(a+x,y)——赋值即(-inf,b),增加为(a,-inf)。(是不是感觉很妙啊qwqwq)

如果标记(x2,y2)合并到(x1,y1)之后,应该是这个样子——(x1+x2,max(y1+x2,y2))。(根据合并顺序,应该不难理解)

代码如下:

Node2 operator + (struct Node2 a,struct Node2 b){return (Node2){max(-inf,a.x+b.x),max(a.y+b.x,b.y)};}
Node2 max (struct Node2 a,struct Node2 b){return (Node2){max(a.x,b.x),max(a.y,b.y)};}

然后我们维护两个标记——一个叫tag,和普通线段树里面的lazy标记一样,正常维护现在的更改。一个叫tag2,维护历史操作。

先看核心的维护操作:
(本来solve是给push_down用的,但是其实update里面也是可以调用的。我们把a,b传参数的时候传一样的即可。)

inline void solve(int x,Node2 a,Node2 b)
{//注意更新顺序不要反了,因为每次update的时候已经给tag和tag2都修改过了相一致的值//所以这里如果先更新now再更新历史值,显然会累加,重复计算。t[x].pre_max=max(t[x].pre_max,max(t[x].now_max+b.x,b.y));t[x].now_max=max(t[x].now_max+a.x,a.y);tag2[x]=max(tag2[x],tag[x]+b);//将b合并给tag,之后用这个去更新历史最大的标记tag[x]=tag[x]+a;//将a合并给tag
}

然后我们来看push_down操作:

inline void push_down(int x)
{solve(ls(x),tag[x],tag2[x]);solve(rs(x),tag[x],tag2[x]);//给做右区间分别下方当前标记,和历史标记tag[x].x=tag2[x].x=0;tag[x].y=tag2[x].y=-inf;//注意push_down之后对两个标记的还原(因为什么都没有加,所以x=0。//因为也不需要取最大,所以y=-inf
}

完整代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define inf 0x3f3f3f3f
#define MAXN 100010
using namespace std;
int n,m;
int a[MAXN];struct Node{int l,r,now_max,pre_max;}t[MAXN<<2];struct Node2{int x,y;}tag[MAXN<<2],tag2[MAXN<<2];Node2 operator + (struct Node2 a,struct Node2 b){return (Node2){max(-inf,a.x+b.x),max(a.y+b.x,b.y)};}Node2 max (struct Node2 a,struct Node2 b){return (Node2){max(a.x,b.x),max(a.y,b.y)};}inline int ls(int x){return x<<1;}inline int rs(int x){return x<<1|1;}inline void push_up(int x)
{t[x].now_max=max(t[ls(x)].now_max,t[rs(x)].now_max);t[x].pre_max=max(t[ls(x)].pre_max,t[rs(x)].pre_max);
}inline void solve(int x,Node2 a,Node2 b)
{t[x].pre_max=max(t[x].pre_max,max(t[x].now_max+b.x,b.y));t[x].now_max=max(t[x].now_max+a.x,a.y);tag2[x]=max(tag2[x],tag[x]+b);tag[x]=tag[x]+a;
}inline void push_down(int x)
{solve(ls(x),tag[x],tag2[x]);solve(rs(x),tag[x],tag2[x]);tag[x].x=tag2[x].x=0;tag[x].y=tag2[x].y=-inf;
}inline void build(int x,int l,int r)
{t[x].l=l,t[x].r=r;tag[x].x=tag2[x].x=0;tag[x].y=tag2[x].y=-inf;if(l==r){t[x].now_max=t[x].pre_max=a[l];return;}int mid=(l+r)>>1;build(ls(x),l,mid);build(rs(x),mid+1,r);push_up(x);
}inline void update(int x,int ll,int rr,Node2 k)
{int l=t[x].l,r=t[x].r;if(ll<=l&&r<=rr){solve(x,k,k);return;}int mid=(l+r)>>1;push_down(x);if(ll<=mid) update(ls(x),ll,rr,k);if(mid<rr) update(rs(x),ll,rr,k);push_up(x);
}inline int query(int x,int ll,int rr,int op)
{int l=t[x].l,r=t[x].r;if(ll<=l&&r<=rr){if(op==0) return t[x].now_max;else return t[x].pre_max;}int mid=(l+r)>>1,cur_ans=-inf;push_down(x);if(ll<=mid) cur_ans=max(cur_ans,query(ls(x),ll,rr,op));if(mid<rr) cur_ans=max(cur_ans,query(rs(x),ll,rr,op));return cur_ans;
}int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);freopen("ce.out","w",stdout);#endifscanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);scanf("%d",&m);build(1,1,n);for(int i=1;i<=m;i++){char s[10];int l,r,k;Node2 cur; scanf("%s%d%d",s,&l,&r);if(s[0]=='Q') printf("%d\n",query(1,l,r,0));else if(s[0]=='A') printf("%d\n",query(1,l,r,1));else if(s[0]=='P') {scanf("%d",&k);cur.x=k,cur.y=-inf;update(1,l,r,cur);}else if(s[0]=='C'){scanf("%d",&k);cur.x=-inf,cur.y=k;update(1,l,r,cur);}}return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10508486.html

BZOJ3064 CPU监控相关推荐

  1. AIX系统CPU监控与评估

    AIX系统CPU监控与评估 一, VMSTAT命令(CPU) 1.1 cpu 1.2 kthr(内核等待) 1.3 faults故障 1.4 memory(内存) 1.5 page磁盘交换 二, io ...

  2. BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值)

    BZOJ #3064. Tyvj 1518 CPU监控(线段树,历史最值) Solution 我们考虑用线段树维护此题. 先不考虑历史最值. 大概需要维护一种特殊的懒标记(x,y)(x,y)(x,y) ...

  3. linux top 命令可视化_linux性能监控:CPU监控命令之top命令

    ​ CPU监控命令之top命令 1概述: top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top是一 ...

  4. linux服务器系统cpu监控-shell脚本

    监控服务器系统cpu占用情况: 1.使用top命令查看linux系统cpu使用情况:  #  top -b -n 1 | grep Cpu   (-b -n 1 表只需要1次的输出结果)      C ...

  5. 基于 HTML5 WebGL 的 CPU 监控系统

    前言 科技改变生活,科技的发展带来了生活方式的巨大改变.随着通信技术的不断演进,5G 技术应运而生,随时随地万物互联的时代已经来临.5G 技术不仅带来了更快的连接速度和前所未有的用户体验,也为制造业, ...

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

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

  7. Linux性能监控(CPU监控)

    Linux性能监控(CPU监控) 主要分为四类: cup监控 内存监控命令 IO性能 网络性能 cup监控 关于CPU,有3个重要的概念:上下文切换(context switchs),运行队列(Run ...

  8. Linux命令进阶-cpu监控内存监控文件IO网络IO性能分析

    Linux命令进阶-cpu监控内存监控文件IO网络IO性能分析 前言 1 linux基础命令 1.1 grep 1.2 ls 1.3 find 1.4 ulimit 1.5 curl 1.6 scp ...

  9. jmeter添加服务器cpu监控插件

    jmeter添加服务器cpu监控插件

最新文章

  1. Zookeeper下载
  2. asynchttpclient 超时_深圳拟出台标准:外卖配送超时,要补偿消费者
  3. Android软件开发需要学什么
  4. HDU - 6267 (概论/找规律/递推)
  5. cad钣金展开插件_户外垃圾桶顶盖钣金拆分展开方法
  6. virtualbox虚拟机安装Ubuntu异常处理:FATAL: NO bootable medium found! System halted
  7. opencv测试代码_玩转OpenCv(二):安装vs2010和opencv3
  8. dataframe scala 修改值_Spark DataFrame:提取某列并修改/ Column更新、替换
  9. IOS开发之Target-Action模式
  10. 安全扫描利器-xscan3.3中文版
  11. 史上最全 ArcGIS 软件安装包分享
  12. linux测速(含脚本)
  13. UT000054: The maximum size 1048576 for an individual file in a multipart req
  14. hp服务器怎么装win7系统,惠普280 Pro G4台式机intel 8代cpu安装win7步骤
  15. 云服务器架设大话西游2,端游[大话西游]天演册虚拟机镜像一键启动服务端+客户端+GM工具等...
  16. 什么是实时操作系统(RTOS)
  17. Gitee (码云)操作
  18. 水电表、工控、医用电子设备等超低功耗段码LCD液晶显示驱动IC-VKL144A/B,TSSOP48/QFN48,工作电流<10微安,可完全兼容替代PCF8551、MCP144、BU9792、9B92等
  19. windows10 驱动开发环境搭建vs2019 helloworld
  20. 学通信工程考计算机等级证书,通信工程专业可以考什么证书

热门文章

  1. 微信小程序轮播图中间变大_微信小程序实现带放大效果的轮播图
  2. nyoj 586 疯牛(二分+贪心)
  3. php print r用法,php中echo(),print(),print_r()用法
  4. python 全局变量、局部变量
  5. Hive是如何让MapReduce实现SQL操作的?
  6. LeetCode MySQL 1495. Friendly Movies Streamed Last Month
  7. LeetCode 241. 为运算表达式设计优先级(动态规划)
  8. LeetCode 345. 反转字符串中的元音字母
  9. LeetCode 139. 单词拆分(DP)
  10. LeetCode 380. 常数时间插入、删除和获取随机元素(哈希+vector)