题面

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

用(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. bcd引导Ubuntu

    下面步骤就是创建Windows的启动项了. 以管理员身份打开CMD, 然后输入 bcdedit /create /d "ubuntu" /application bootsecto ...

  2. 编译Android VNC Server

    1,在如下地址checkout源代码,我checkout的版本为0.9.7http://code.google.com/p/android-vnc-server/source/checkout 2,在 ...

  3. Scrum立会报告+燃尽图(十二月八日总第三十九次):制定视频方案

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  4. (第十一周)约跑APP测试报告

    项目名称:约跑App 用户需求规格说明书URL:http://www.cnblogs.com/liquan/p/6071804.html 组长博客URL:http://www.cnblogs.com/ ...

  5. 2-Eighth Scrum Meeting20151208

    任务分配 闫昊: 今日完成:和唐彬讨论研究上届的网络接口代码. 明日任务:商讨如何迁移ios代码到android平台. 唐彬: 今日完成:和闫昊讨论研究上届的网络接口代码. 明日任务:商讨如何迁移io ...

  6. static 继承

    静态方法大家应该都比较熟悉,在这里主要谈一下静态方法在继承时的一些注意事项. 1.父类方法如果是静态方法,子类不能覆盖为非静态方法: 2.父类方法如果是非静态方法,子类不能覆盖为静态方法: 3.父类静 ...

  7. Date 类的使用

    package com.Date.Math; import java.text.ParseException; import java.text.SimpleDateFormat; import ja ...

  8. 结对项目-小学生四则运算系统(GUI)

    Coding克隆地址:https://git.coding.net/FrrLolix/CalGUI.git 伙伴博客:http://www.cnblogs.com/wangyy39/p/8763244 ...

  9. 对于Redis的了解

    Redis :高性能的key-value数据库,支持存储的value类型包括字符串.链表.集合.有序集合.哈希类型. redis使用两种文件格式:全量数据和增量请求. 全量数据格式是将内存中的数据写入 ...

  10. C/C++ 打印文件名、行号、函数名的方法

    转自:http://zhidao.baidu.com/link?url=JLCaxBAXLJVcx_8jsyJVF92E_bZjo4ONJ5Ab-HGlNBc1dfzcAyFAIygwP1qr18aa ...