题面

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

用(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. Netty源码分析第7章(编码器和写数据)---->第2节: MessageToByteEncoder

    Netty源码分析第七章: Netty源码分析 第二节: MessageToByteEncoder 同解码器一样, 编码器中也有一个抽象类叫MessageToByteEncoder, 其中定义了编码器 ...

  2. 占位符golang

    定义示例类型和变量 type Human struct { Name string } var people = Human{Name:"zhangsan"} 普通占位符 占位符 ...

  3. yum安装lnmp

    python其他知识目录 1.安装LNMP之前要安装EPEL,以便安装源以外的软件,如Nginx,phpMyAdmin等. yum install epel-release 提示:EPEL,即Extr ...

  4. 自制session

    原理 1.面向对象中通过索引的方式访问对象,需要内部实现 __getitem__ .__delitem__.__setitem__方法 2.Tornado框架中,默认执行Handler的get/pos ...

  5. web11 Struts处理表单数据

    电影网站:www.aikan66.com 项目网站:www.aikan66.com游戏网站:www.aikan66.com图片网站:www.aikan66.com书籍网站:www.aikan66.co ...

  6. 第一阶段Spring个人总结

    通过这一阶段的冲刺,我感到的是名义上的团队,而实际上却是一个人的事,每个人跟每个人都不一样,都有自己的特点,总会出些不必要的麻烦. 还有团队的进展也是看不到什么东西,说实话,这次我并没有太多关注团队的 ...

  7. java 事务

    之前的事务介绍基本都是数据库层面的事务,本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解. 关于事务的基础知识这里不再详细介绍,想要了解的同学可以在我的博客中阅读 ...

  8. 配置树莓派/Linux默认声卡设备

    1.设置默认声卡为USB声卡 在$HOME下新建.asoundrc $cd $HOME $nano .asoundrc 输入以下内容 defaults.ctl.card 1 defaults.pcm. ...

  9. Beta阶段团队项目开发篇章3

    例会时间 2016.12.6晚 例会照片 个人工作 上阶段任务验收 中英文切换功能已经实现,调查结果分析已经完成,博客基本撰写完成,在征求其他组员意见后发布.任务基本完成. 任务分配 组员 任务内容 ...

  10. python基础(六)python操作excel

    一.python操作excel,python操作excel使用xlrd.xlwt和xlutils模块,xlrd模块是读取excel的,xlwt模块是写excel的,xlutils是用来修改excel的 ...