BZOJ3064 CPU监控

题目链接:戳我

比较神仙的一个题(至少对于我这个小蒟蒻来说。。。)下面尽可能详细地解释一下吧。。。学习来源:这位神仙的题解

其实就是对于操作的转换。我们设(x,y)为操作的参数,设当前数为a,操作为max(a+x,y)——赋值即(-inf,b),增加为(a,-inf)。(是不是感觉很妙啊qwqwq)

如果标记(x2,y2)合并到(x1,y1)之后,应该是这个样子——(x1+x2,max(y1+x2,y2))。(根据合并顺序,应该不难理解)

代码如下:

Node2 operator + (struct Node2 a,struct Node2 b){return (Node2){max(-inf,a.x+b.x),max(a.y+b.x,b.y)};}
Node2 max (struct Node2 a,struct Node2 b){return (Node2){max(a.x,b.x),max(a.y,b.y)};}

然后我们维护两个标记——一个叫tag,和普通线段树里面的lazy标记一样,正常维护现在的更改。一个叫tag2,维护历史操作。

先看核心的维护操作:
(本来solve是给push_down用的,但是其实update里面也是可以调用的。我们把a,b传参数的时候传一样的即可。)

inline void solve(int x,Node2 a,Node2 b)
{//注意更新顺序不要反了,因为每次update的时候已经给tag和tag2都修改过了相一致的值//所以这里如果先更新now再更新历史值,显然会累加,重复计算。t[x].pre_max=max(t[x].pre_max,max(t[x].now_max+b.x,b.y));t[x].now_max=max(t[x].now_max+a.x,a.y);tag2[x]=max(tag2[x],tag[x]+b);//将b合并给tag,之后用这个去更新历史最大的标记tag[x]=tag[x]+a;//将a合并给tag
}

然后我们来看push_down操作:

inline void push_down(int x)
{solve(ls(x),tag[x],tag2[x]);solve(rs(x),tag[x],tag2[x]);//给做右区间分别下方当前标记,和历史标记tag[x].x=tag2[x].x=0;tag[x].y=tag2[x].y=-inf;//注意push_down之后对两个标记的还原(因为什么都没有加,所以x=0。//因为也不需要取最大,所以y=-inf
}

完整代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define inf 0x3f3f3f3f
#define MAXN 100010
using namespace std;
int n,m;
int a[MAXN];struct Node{int l,r,now_max,pre_max;}t[MAXN<<2];struct Node2{int x,y;}tag[MAXN<<2],tag2[MAXN<<2];Node2 operator + (struct Node2 a,struct Node2 b){return (Node2){max(-inf,a.x+b.x),max(a.y+b.x,b.y)};}Node2 max (struct Node2 a,struct Node2 b){return (Node2){max(a.x,b.x),max(a.y,b.y)};}inline int ls(int x){return x<<1;}inline int rs(int x){return x<<1|1;}inline void push_up(int x)
{t[x].now_max=max(t[ls(x)].now_max,t[rs(x)].now_max);t[x].pre_max=max(t[ls(x)].pre_max,t[rs(x)].pre_max);
}inline void solve(int x,Node2 a,Node2 b)
{t[x].pre_max=max(t[x].pre_max,max(t[x].now_max+b.x,b.y));t[x].now_max=max(t[x].now_max+a.x,a.y);tag2[x]=max(tag2[x],tag[x]+b);tag[x]=tag[x]+a;
}inline void push_down(int x)
{solve(ls(x),tag[x],tag2[x]);solve(rs(x),tag[x],tag2[x]);tag[x].x=tag2[x].x=0;tag[x].y=tag2[x].y=-inf;
}inline void build(int x,int l,int r)
{t[x].l=l,t[x].r=r;tag[x].x=tag2[x].x=0;tag[x].y=tag2[x].y=-inf;if(l==r){t[x].now_max=t[x].pre_max=a[l];return;}int mid=(l+r)>>1;build(ls(x),l,mid);build(rs(x),mid+1,r);push_up(x);
}inline void update(int x,int ll,int rr,Node2 k)
{int l=t[x].l,r=t[x].r;if(ll<=l&&r<=rr){solve(x,k,k);return;}int mid=(l+r)>>1;push_down(x);if(ll<=mid) update(ls(x),ll,rr,k);if(mid<rr) update(rs(x),ll,rr,k);push_up(x);
}inline int query(int x,int ll,int rr,int op)
{int l=t[x].l,r=t[x].r;if(ll<=l&&r<=rr){if(op==0) return t[x].now_max;else return t[x].pre_max;}int mid=(l+r)>>1,cur_ans=-inf;push_down(x);if(ll<=mid) cur_ans=max(cur_ans,query(ls(x),ll,rr,op));if(mid<rr) cur_ans=max(cur_ans,query(rs(x),ll,rr,op));return cur_ans;
}int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);freopen("ce.out","w",stdout);#endifscanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);scanf("%d",&m);build(1,1,n);for(int i=1;i<=m;i++){char s[10];int l,r,k;Node2 cur; scanf("%s%d%d",s,&l,&r);if(s[0]=='Q') printf("%d\n",query(1,l,r,0));else if(s[0]=='A') printf("%d\n",query(1,l,r,1));else if(s[0]=='P') {scanf("%d",&k);cur.x=k,cur.y=-inf;update(1,l,r,cur);}else if(s[0]=='C'){scanf("%d",&k);cur.x=-inf,cur.y=k;update(1,l,r,cur);}}return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10508486.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java socket 实现增删改查 + 在线答题小案例

实现效果 &#xff08;1&#xff09; 在client端可以实现对数据库的操作&#xff08;Select&#xff0c;Insert&#xff0c;Update&#xff0c;Delete&#xff09; &#xff08;2&#xff09;数据库中创建一个考试表和学生表&#xff0c;考试表中问题是四项选择题&#xff08;…

90后斯坦福博士论文登Science封面!AI算法准确预测RNA三维结构

来源&#xff1a;Science编辑&#xff1a;yaxin、su「我们对大部分RNA的结构几乎一无所知。」半个世纪以来&#xff0c;确定生物分子的三维结构一直困惑着科学家&#xff0c;也是生物学的重大挑战之一。难就难在&#xff0c;RNA折叠成复杂三维结构的形状很难通过实验或计算来确…

Event Recommendation Engine Challenge分步解析第五步

一、请知晓 本文是基于&#xff1a; Event Recommendation Engine Challenge分步解析第一步 Event Recommendation Engine Challenge分步解析第二步 Event Recommendation Engine Challenge分步解析第三步 Event Recommendation Engine Challenge分步解析第四步 需要读者先阅读…

计算机网络之RIP协议与OSPF协议模拟、UDP与TCP编程,Wireshark抓包分析

通过Python模拟RIP协议,OSPF协议,并模拟UDP和TCP编程,并通过Wireshark抓包工具,对所发送的报文进行捕获分析。 文章目录 一、RIP协议的模拟与编程二、OSPF协议的模拟与编程三、UDP编程四、TCP套接字编程五、Wireshark 数据分析六、总结一、RIP协议的模拟与编程 1.1 题目 …

虚拟机 NAT模式与桥接模式的区别

同个人网站 https://www.serendipper-x.cn/&#xff0c;欢迎访问 &#xff01; NAT模式&#xff1a;相当于宿主机再构建一个局域网&#xff0c;虚拟机无法和本局域网中的其他真实主机进行通讯。只需要宿主机器能访问互联网&#xff0c;那么虚拟机就能上网&#xff0c;不需要再…

基础研究和前沿技术领域校企融合协同创新的国际经验及启示

来源&#xff1a;中国科学技术发展战略研究院作者&#xff1a;薛姝、何光喜、张文霞原载于《全球科技经济瞭望》2021年5月第5期摘要&#xff1a;促进大学与企业的合作是各个国家科技创新政策和创新体系建设的重点任务&#xff0c;近年来也出现了加强在基础研究和前沿技术领域加…

数据可视化之会议论文收录信息可视化与分析

提示:本文章通过Python来对某网站上发布的论文信息进行可视化,主要分为通过爬虫解析网页,获取数据,以及数据预处理,数据的可视化及分析等。 文章目录 前言一、题目描述二、数据的获取与处理2.1 数据的获取2.2 数据预处理三、数据分析及可视化3.1 论文标题词云3.2 热点词汇…

BZOJ.3811.玛里苟斯(线性基)

BZOJUOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...&#xff08;虽然理解后也觉得没有那么难&#xff09; 结合两篇写的比较好的详细写一写。如果有错要指出啊QAQhttps://blog.csdn.net/smallsxj/article/details/73205569https://www.cnblogs.com/wujiechao/…

理解云计算三种服务模式——IaaS、PaaS和SaaS

云计算的服务模式仍在不断进化&#xff0c;但业界普遍接受将云计算按照服务的提供方式划分为三个大类&#xff1a;SaaS&#xff08;Software as a Service–软件即服务&#xff09; PaaS&#xff08;Platform as a Service–平台即服务&#xff09; IaaS&#xff08;Infrastruc…

术,路,心:陈天桥的大脑行旅

来源&#xff1a; 脑极体在互联网、云计算与电动汽车之后&#xff0c;连同资本、产业、学术界在内的社会各界&#xff0c;纷纷开始将目光投向更远的地方。下一个超级机会藏在何处&#xff1f;下一个改变人类文明的技术机遇何时触发&#xff1f;随着各国开始在国家战略层面布局下…

8万行的insert数据,Ctrl+c、Ctrl+v后心态崩了(如何在Linux下对MySQL数据库执行sql文件)...

从最下面可以看到&#xff0c;差不多有86389行&#xff0c;Ctrlc、Ctrlv后 PHPstorm一直没有反应。。。。 肿么办&#xff1f;&#xff1f;复制粘贴不行的话&#xff0c;可以用什么方法把数据插入到数据库中&#xff0c;数据库用的是MySQL。 皇天不负有心人&#xff0c;卧薪尝胆…

链路状态路由协议与OSPF

链路状态路由算法&#xff08;LS算法&#xff09; 工作原理 每个路由器将自己的链路状态信息洪泛到网络上的所有路由器。tips:&#xff08;每个路由器都洪泛会给网络带来负担&#xff09;每个路由器最终会知道整个网络的拓扑结构&#xff08;LSDB&#xff09;。每个路由器使用…

计算机视觉之模板匹配算法、SIFT特征匹配与目标检测、相机标定、RANSAC算法简介

文章目录 前言摘要一、模板匹配算法1.1 算法原理简介1.2 数据结构及算法设计1.3 实验结果1.4 总结二、SIFT特征匹配与目标检测2.1 算法原理2.2 关键代码2.3 实验结果三、相机标定3.1 准备3.2 角点检测四、RANSAC 算法4.1 算法原理4.2 算法基本思想4.3 算法设计4.4 总结五、视频…

感知算法、规划地图……波士顿动力揭秘Atlas机器人跑酷背后的技术

来源&#xff1a;机器之心&#xff0c;编辑&#xff1a;nhyilin仅用于学术分享&#xff0c;版权属于原作者几天前&#xff0c;波士顿动力公司放出了双足人形机器人 Atlas 的最新酷炫视频。这次&#xff0c;Atlas 展示了它的最新技能「跑酷」。在一系列倾斜胶合板还有木箱垒成的…

第七届蓝桥杯省赛---蚂蚁感冒

长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左&#xff0c;有的朝右。 每只蚂蚁都只能沿着杆子向前爬&#xff0c;速度是1厘米/秒。 当两只蚂蚁碰面时&#xff0c;它们会同时掉头往相反的方向爬行。 这些蚂蚁中&#xff0c;有1只蚂蚁感冒了。 并且在和其它蚂蚁碰面时&am…

BGP协议

概述 BGP是目前“唯一”的EGP协议&#xff0c;用于AS之间传递路由信息&#xff0c;目前版本为4 为什么需要BGP&#xff1f; 不同AS自治系统的管理部门不同&#xff0c;路由策略不同AS之间的路由不强调最优路径&#xff0c;更强调路由控制和路由策略 IGP与BGP对比 IGP关注如…

轮廓提取之滚球法、凹包算法

提示:本文章主要介绍轮廓提取算法------滚球法的运用,可用于提取点云等二维、三维数据的轮廓,以及代码框架设计。 文章目录 前言一、基于二维点数据的模型轮廓提取算法1.1 适用场景1.2 问题思考及解决方法1.3 点加密1.4 存储结构与设计思路二、关键代码设计2.1 滚球法2.2 极…

Science Robotics:新型多足机器人可自行组装,零件损坏时也能继续运动

来源&#xff1a;DeepTech深科技在自然环境中&#xff0c;群体昆虫&#xff08;如蜜蜂、蚂蚁、白蚁等&#xff09;、鱼类和鸟类等动物可以通过合作来完成生物个体难以或不可能完成的任务。受到这些集群行为的启发&#xff0c;许多研究人员研究了自组装或可重构的模块化群机器人…

NAT与DHCP协议

DHCP概述 DHCP产生的原因 大型网络中静态配置IP地址容易出现地址冲突 定义 DHCP&#xff1a;动态主机配置协议&#xff0c;用于主机自动获得IP地址、子网掩码、网关地址、DNS服务器地址&#xff0c;租用期等相关信息。采用C/S模式。DHCP给运行服务器软件、且位置固定的计算机…

OpenGL基础入门及准备

一、计算机图像学相关概念 1.1 计算机图形学&#xff0c;是一种使用数学算法将二维或三维图形转化为计算机显示器所能显示的二维栅格形式的科学。 1.2 屏幕像素组成的网格即称为栅格。 1.3 计算机图形学研究 Modeling&#xff1a;构造场景的三维模型&#xff0c;建模&#…