题面

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

用(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. 高可用OpenStack(Queen版)集群-10.Nova计算节点

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  2. 配置Ubuntu16.04虚拟机 (用途:CTF_pwn)

    因为学习需要16.xx的虚拟机,所以把之前18.04的Ubuntu卸掉重装了一遍Ubuntu16.04, 考虑到我有备份和重装系统的爱好,故记之,以备后用. 目录: //最后更新时间:190122·1 ...

  3. mongodb基本使用(三)

    MongoDB 创建数据库 语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 如果你想查看所有数据库,可以使 ...

  4. Python3中的函数 大全

    Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().但也可以自己创建 ...

  5. 随手记录-linux-Linux目录结构

    转:别人的 装完Linux,首先需要弄清Linux 标准目录结构 / root —?启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home —?存储普通用户的个人文件 ft ...

  6. Beta发布文案+美工

    团队名称:探路者 1蔺依铭:http://www.cnblogs.com/linym762/(组长) 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www ...

  7. java实验2实验报告(20135232王玥)

    实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解 ...

  8. 20172308 实验三《Java面向对象程序设计 》实验报告

    20172308 2017-2018-2 <程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...

  9. Task 6.3 冲刺Two之站立会议1

    今天是二次冲刺的第一天,由于第一阶段已经大概完成了软件的主体功能和框架,我主要看了一下同学们提出的视频和音质的问题,想办法做出了相应的改善.另外我们的功能还是比较单一的,要对主界面进行一定的扩充,所以 ...

  10. MAVEN ERROR maven-resources-plugin

    maven新建项目时报错 Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin: ...