题面

线段树·二重标记(什么鬼

用(a,b)标记表示先执行+a操作,然后对b取max,维护历史/当前最大值和历史/当前标记。然后我们发现区间加$x$就是$(x,-inf)$,区间赋$x$就是$(-inf,x)$。标记有两种更新,一种是和当前的标记合并,一种是更新历史标记。

把一个标记tag合并进当前标记ntag,显然新标记即

$(ntag.a+tag.a,max(ntag.b+tag.a,tag.b))$

把历史标记htag用一个标记tag更新更简单,其实就是对应取max

那么就可以做了:修改标记即先把当前标记和要加的标记合并,然后更新历史标记;修改最大值将当前最大值按标记意思改,然后历史最大值和当前最大值取max。下放标记类似

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,inf=0x3f3f3f3f;
struct a
{
int ad,mx;
void init()
{
ad=,mx=-inf;
}
}hist[*N],nowt[*N];
a operator + (a x,a y)
{
return (a){max(-inf,x.ad+y.ad),max(x.mx+y.ad,y.mx)};
}
a operator ^ (a x,a y)
{
return (a){max(x.ad,y.ad),max(x.mx,y.mx)};
}
int seq[N],hmax[*N],nmax[*N];
int n,m,t1,t2,t3; char str[];
void Pushup(int nde)
{
int ls=*nde,rs=*nde+;
hmax[nde]=max(hmax[ls],hmax[rs]);
nmax[nde]=max(nmax[ls],nmax[rs]);
}
void Apply(int nde,int tsk)
{
hist[nde]=hist[nde]^(nowt[nde]+hist[tsk]); nowt[nde]=nowt[nde]+nowt[tsk];
hmax[nde]=max(hmax[nde],max(nmax[nde]+hist[tsk].ad,hist[tsk].mx));
nmax[nde]=max(nmax[nde]+nowt[tsk].ad,nowt[tsk].mx);
}
void Release(int nde)
{
int ls=*nde,rs=*nde+;
Apply(ls,nde),Apply(rs,nde);
hist[nde].init(),nowt[nde].init();
}
void Create(int nde,int l,int r)
{
hist[nde].init(),nowt[nde].init();
if(l==r)
hmax[nde]=nmax[nde]=seq[l];
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+;
Create(ls,l,mid),Create(rs,mid+,r);
Pushup(nde);
}
}
void Change(int nde,int l,int r,int nl,int nr,a tsk)
{
if(l>nr||r<nl)
return ;
else if(l>=nl&&r<=nr)
{
hist[nde]=hist[nde]^(nowt[nde]+tsk); nowt[nde]=nowt[nde]+tsk;
hmax[nde]=max(hmax[nde],max(nmax[nde]+tsk.ad,tsk.mx));
nmax[nde]=max(nmax[nde]+tsk.ad,tsk.mx);
}
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+; Release(nde);
Change(ls,l,mid,nl,nr,tsk),Change(rs,mid+,r,nl,nr,tsk);
Pushup(nde);
}
}
int Query(int nde,int l,int r,int nl,int nr,int typ)
{
if(l>nr||r<nl)
return -inf;
else if(l>=nl&&r<=nr)
return typ?nmax[nde]:hmax[nde];
else
{
int mid=(l+r)/,ls=*nde,rs=*nde+; Release(nde);
return max(Query(ls,l,mid,nl,nr,typ),Query(rs,mid+,r,nl,nr,typ));
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&seq[i]);
Create(,,n),scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%s%d%d",str,&t1,&t2);
if(str[]=='Q') printf("%d\n",Query(,,n,t1,t2,));
else if(str[]=='A') printf("%d\n",Query(,,n,t1,t2,));
else if(str[]=='P') scanf("%d",&t3),Change(,,n,t1,t2,(a){t3,-inf});
else if(str[]=='C') scanf("%d",&t3),Change(,,n,t1,t2,(a){-inf,t3});
}
return ;
}

解题:洛谷4314 CPU监控的更多相关文章

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

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

  2. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  3. 【解题报告】洛谷 P2571 [SCOI2010]传送带

    [解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...

  4. 【解题报告】 洛谷 P3492 [POI2009]TAB-Arrays

    [解题报告] 洛谷 P3492 [POI2009]TAB-Arrays 这题是我随机跳题的时候跳到的.写完这道题之后,顺便看了一下题解,发现只有一篇题解,所以就在这里顺便写一个解题报告了. 首先当然是 ...

  5. 【解题报告】洛谷 P1231 教辅的组成

    [解题报告]洛谷 P1231 教辅的组成 题目链接 CSDN链接 这道题就只是一道普通的最大流问题,但是关键所在就是如何构图.要不是我看了题解,真的想不到这个构图方法呢 题目大意我就不写了,自己看好了 ...

  6. CPU监控 解题报告

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

  7. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  8. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  9. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

随机推荐

  1. Plasma Cash 合约解读

    作者介绍 虫洞社区·签约作者 steven bai Plasma Cash 合约解读 Plasma Cash 合约解读 1. 合约代码 2. 合约文件简单介绍 3. Plasma Cash 的基础数据 ...

  2. Metasploit拿Shell

    进入metasploit系统 msfconsole Nmap端口扫描 nmap –sV IP(或者域名),如果机器设置有防火墙禁ping,可以使用nmap -P0(或者-Pn) –sV IP(或者域名 ...

  3. web.xml配置文件中<async-supported>true</async-supported>报错

    web.xml配置文件中<async-supported>true</async-supported>报错 http://blog.csdn.net/dream_ll/arti ...

  4. 第九次作业psp

    psp 进度条 代码累积折线图 博文累积折线图 psp饼状图

  5. HTML基础学习总结

    一.HTML的一些基本描述 全称:Hyper Text Markup Language 定义:超文本标记语言,是标记语言而不是编程语言,使用标记标签来描述网页,所以也被称为网页 格式:标签对里面放纯文 ...

  6. youi软件测试计划

    beta版本中,我们将重视软件开发中的测试. 我们的软件是需要测试的,不测试怎么知道好与不好呢?有的程序不测试甚至都不能运行-- 我们的目标呢:就是经过测试之后软件的质量得到有效的保证.不管什么情况都 ...

  7. Android里面安装windows系统

        安装前请确认以下条件:①:存储卡需要有大于302M的空间. 下载安装:1.下载文件并安装:①:下载地址:http://kuai.xunlei.com/d/hWIkAAIkJwAawgZUa3c ...

  8. HTML和CSS <h1> --2-- <h1>

    认识html文件基本结构 这一节中我们来学习html文件的结构:一个HTML文件是有自己固定的结构的. <html> <head>...</head> <bo ...

  9. Visual Studio 中配置openCV问题

    1. 首先强调一点:VS与openCV的版本对应问题,一般而言,openCV对于VS采用向下的支持方式: vc6 -> VS6.0 vc7.0 -> VS2002 vc7.1 -> ...

  10. Linux下管道重定向使用以及Shell编程(操作系统)

    实验名称:Linux的基本操作 实验目的: 1.了解管道和重定向 2.熟悉基本的Linux脚本的编写 实验环境:Ubuntu 12.4(32位,简体中文) 实验内容: 1.将当前用户目录下的文件清单输 ...