传送门

这是个远古巨坑阿qwq

没有历史最大值还是能比较好做的.可能会有一个想法,就是直接维护线段树每个结点出现过的历史最大值,每次最大值变化就更新.但是有个问题:可能一个点能影响历史最大值的标记还没被及时下放,就被父亲标记覆盖了,这样就可能得到错误答案

考虑新定义标记\((a,b)\),表示对一个结点先加\(a\)然后和\(b\)求max.这种定义下,区间加就是\((x,-\infty)\),赋值就是\((-\infty,x)\).然后如果两个标记合并,假设是\((a,b)\)并上\((x,y)\),那么应该是\((a+x,max(b+x,y))\).手玩发现这样是对的

但是还是没解决历史最大值的问题.现在多开一种标记,表示影响历史最大值的标记.这一种标记\((a,b)\)并上\((x,y)\)应该是\((max(a,x),max(b,y))\),原因是可以看成是两个分段函数取max

然后就没然后了,线段树怎么搞就怎么搞

#include<bits/stdc++.h>
#define LL long long
#define ldb long double
#define il inline
#define re register using namespace std;
const int N=1e5+10,inf=999999999;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct TAG
{
int a,b;
TAG(){a=0,b=-inf;}
TAG(int na,int nb){a=na,b=nb;}
il void clr(){a=0,b=-inf;}
TAG operator + (const TAG &bb) const {return TAG(max(-inf,a+bb.a),max(b+bb.a,bb.b));} //小心boom int
TAG operator & (const TAG &bb) const {return TAG(max(a,bb.a),max(b,bb.b));}
}nt[N<<2],ht[N<<2];
int ns[N<<2],hs[N<<2];
il void psup(int o){hs[o]=max(hs[o<<1],hs[o<<1|1]),ns[o]=max(ns[o<<1],ns[o<<1|1]);}
il void ad(int o,TAG x,TAG y)
{
ht[o]=ht[o]&(nt[o]+y);
nt[o]=nt[o]+x;
hs[o]=max(hs[o],max(ns[o]+y.a,y.b));
ns[o]=max(ns[o]+x.a,x.b);
}
il void psdn(int o)
{
ad(o<<1,nt[o],ht[o]),ad(o<<1|1,nt[o],ht[o]);
nt[o].clr(),ht[o].clr();
}
#define mid ((l+r)>>1)
void modif(int o,int l,int r,int ll,int rr,TAG x)
{
if(ll<=l&&r<=rr) {ad(o,x,x);return;}
psdn(o);
if(ll<=mid) modif(o<<1,l,mid,ll,rr,x);
if(rr>mid) modif(o<<1|1,mid+1,r,ll,rr,x);
psup(o);
}
int quer(int o,int l,int r,int ll,int rr,bool op)
{
if(ll<=l&&r<=rr) return op?hs[o]:ns[o];
psdn(o);
int an=-inf;
if(ll<=mid) an=max(an,quer(o<<1,l,mid,ll,rr,op));
if(rr>mid) an=max(an,quer(o<<1|1,mid+1,r,ll,rr,op));
psup(o);
return an;
}
void bui(int o,int l,int r)
{
if(l==r){ns[o]=hs[o]=rd();return;}
bui(o<<1,l,mid),bui(o<<1|1,mid+1,r);
psup(o);
}
int n,q; int main()
{ n=rd();
bui(1,1,n);
q=rd();
char cc[2];
while(q--)
{
scanf("%s",cc);
if(cc[0]=='Q')
{
int l=rd(),r=rd();
printf("%d\n",quer(1,1,n,l,r,0));
}
else if(cc[0]=='A')
{
int l=rd(),r=rd();
printf("%d\n",quer(1,1,n,l,r,1));
}
else if(cc[0]=='P')
{
int l=rd(),r=rd(),x=rd();
modif(1,1,n,l,r,TAG(x,-inf));
}
else
{
int l=rd(),r=rd(),x=rd();
modif(1,1,n,l,r,TAG(-inf,x));
}
}
return 0;
}

luogu P4314 CPU监控的更多相关文章

  1. P4314 CPU监控

    题面 这是一道堪称"线段树3"的线段树好题,对于\(lazy\)标记的操作可以说是非常巧妙 我们用结构体来记录\(lazy\)标记,结构体中定义\(a,b\)两个元素,\(a\)表 ...

  2. bzoj3064/洛谷P4314 CPU监控【线段树】

    好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ...

  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. 【BZOJ3064】CPU监控(线段树)

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

  8. BZOJ 3064 CPU监控

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

  9. 安卓app测试之cpu监控

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

随机推荐

  1. Manjaro下Steam无法启动

    问题描述 直接在桌面环境运行Steam,不会出现任何反应,甚至没有闪过一个对话框. 在终端中运行Sterm,出现以下提示 Repairing installation, linking /home/z ...

  2. Unity 着色器基础知识

    一.着色器基础知识 着色器通过代码模拟物体表面发生的事情,其实就是GPU中运行的一段代码. 着色器的类型: 顶点着色器.片元着色器.无光照着色器.表面着色器.图像特效着色器.计算着色器. 坐标空间: ...

  3. Ipython Notebook ipynb文件转化为Python脚本

    欢迎关注博主主页,学习python视频资源 方法1. pycharm可以打开 方法2 https://jingyan.baidu.com/article/19192ad8edc736e53e57072 ...

  4. 图论分支-Tarjan初步-边双联通分量

    本来应该先说强连通分量,但是有一定的分配,所以这个在下一篇博客将会见到. 这个本想连点连通分量一起讲,但是量有点大,所以我就分两步讲. 我们先看定义 再来看看图解 很容易就能发现,只要将割边断掉,然后 ...

  5. 01--STL算法(算法基础)

    一:算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中 ...

  6. 互斥量、条件变量与pthread_cond_wait()函数的使用,详解(二)

    1.Linux“线程” 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身只有进程的概念,而其所谓的“线程” ...

  7. Ubuntu 下使用 putty并通过 ch340 usb 串口线进行调试

    安装putty sudo apt-get install putty -y 插入usb转串口线 由于linux下没有Windos类似的设备管理器,所以我们可以通过其他方法获取对应的串口号 可以在插拔之 ...

  8. spring-data-redis分布式

    本文转载http://hbxflihua.iteye.com/blog/2383495 1.引入spring-data-redis依赖的jar 包 <dependency> <gro ...

  9. java生产环境增量发版陷阱【原】

    前言 在生产环境,我们为了降低发版风险,一般都只做增量发布,不做全量发布. 除非项目只有一到两人开发,对时间线和代码脉络结构一清二楚,才可全量发布. 然而增量发布也是有一定隐藏陷阱在里面的,以下就是笔 ...

  10. dom4j基础教程【转】

    转自 http://blog.csdn.net/whatlonelytear/article/details/42234937 ,但经过大量美化及补充. Dom4j是一个易用的.开源的库,用于XML, ...