当前位置: 首页 > news >正文

洛谷题解P4314 [CPU监控]

传送门

CPU监控

题目大意

一个可修改序列,两种操作: 1.区间加 2.区间覆盖 两种查询: 1.区间最大值 2.区间历史最大值

思路

显然,我们需要在线段树上维护最大值,历史最大值,加法标记,覆盖标记。

我们可以用这些来维护最大值,但这对维护历史最大值是不足够的。

反例:如果我们在相同区间上先加一个值,在减一个值,就会导致在pushdown是子区间的历史最大值就会错误。

eg. 8 1 1 10 1 1 1 1 1 3 P 1 8 100 P 1 8 -10 A 3 3

正确答案为110,但如果只维护4个值就会输出100。

在覆盖操作时,同理也会出现上述情况。

所以,我们在线段树上还需要维护历史最大加法标记历史最大覆盖标记

实现

我们发现主要变化的地方在pushdown函数 在pushdown中,我们需要讨论子区间是否被覆盖过冰根据其情况计算。

我们设:

最大值 mx 历史最大值 hmx 加法标记 adtag 历史最大加法标记 hadtag 覆盖标记 cvtag 历史最大覆盖标记 hcvtag

对于加法操作

d表示父节点的加法标记的值 hd表示父节点的历史最大加法标记的值

如果cover为1:说明之前被覆盖过了,此时相当于用d+cvtag进行Cover。

如果cover为0:此时只有加法,用mx+hd和adtag+hd分别更新hmx和hadtag,把mx和adtag加上d。

对于覆盖操作

如果cover为1:用hd更新hcov,取max

如果cover为0:cover改为1,hcvtag变为hd

此外还要更新历史最大值hmx,(和hd取max)

注意:

可能出现覆盖操作比加法操作更劣的情况,所以pushdown时应先下传加法标记,在下传覆盖标记。

我的代码:

#include<cstdio> #include<cmath> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define MAXN 100010 #define lson (id<<1) #define rson (id<<1) + 1 #define inf 2147483647 int t,e; int a[MAXN]; struct TREE{ int l[MAXN*4],r[MAXN*4]; int mx[MAXN*4],hmx[MAXN*4]; int adtag[MAXN*4],hadtag[MAXN*4]; int cvtag[MAXN*4],hcvtag[MAXN*4]; bool cover[MAXN*4]; void pushup(int id){ mx[id] = max(mx[lson],mx[rson]); hmx[id] = max(hmx[id],max(hmx[lson],hmx[rson])); } void pushadd(int id,int d,int hd){ if(cover[id]){ hcvtag[id] = max(hcvtag[id],cvtag[id] + hd); hmx[id] = max(hmx[id],cvtag[id] + hd); cvtag[id] += d;mx[id] = cvtag[id]; adtag[id] = 0; }else{ hadtag[id] = max(hadtag[id],adtag[id] + hd); hmx[id] = max(hmx[id],mx[id] + hd); adtag[id] += d; mx[id] += d; } } void pushcov(int id,int d,int hd){ if(cover[id]){ hcvtag[id] = max(hcvtag[id],hd); }else{ cover[id] = 1; hcvtag[id] = hd; } hmx[id] = max(hmx[id],hd); cvtag[id] = d;mx[id] = d; adtag[id] = 0; } void pushdown(int id){ pushadd(lson,adtag[id],hadtag[id]); pushadd(rson,adtag[id],hadtag[id]); adtag[id] = 0;hadtag[id] = 0; if(cover[id]){ pushcov(lson,cvtag[id],hcvtag[id]); pushcov(rson,cvtag[id],hcvtag[id]); cover[id] = 0;cvtag[id] = 0;hcvtag[id] = 0; } } void build(int L,int R,int id){ l[id] = L;r[id] = R; mx[id] = -inf;hmx[id] = -inf; if(L == R){ mx[id] = a[L]; hmx[id] = a[L]; return ; } int mid = (L + R)>>1; build(L,mid,lson); build(mid + 1,R,rson); pushup(id); } int ask1(int L,int R,int id){ if(l[id] >= L && r[id] <= R){ return mx[id]; } pushdown(id); int ans = -inf; int mid = (l[id] + r[id])>>1; if(L <= mid){ ans = max(ans,ask1(L,R,lson)); } if(R > mid){ ans = max(ans,ask1(L,R,rson)); } pushup(id); return ans; } int ask2(int L,int R,int id){ if(l[id] >= L && r[id] <= R){ return hmx[id]; } pushdown(id); int ans = -inf; int mid = (l[id] + r[id])>>1; if(L <= mid){ ans = max(ans,ask2(L,R,lson)); } if(R > mid){ ans = max(ans,ask2(L,R,rson)); } pushup(id); return ans; } void add(int L,int R,int id,int d){ if(l[id] >= L && r[id] <= R){ pushadd(id,d,d); return ; } pushdown(id); int mid = (l[id] + r[id])>>1; if(L <= mid){ add(L,R,lson,d); } if(R > mid){ add(L,R,rson,d); } pushup(id); } void cov(int L,int R,int id,int d){ if(l[id] >= L && r[id] <= R){ pushcov(id,d,d); return ; } pushdown(id); int mid = (l[id] + r[id])>>1; if(L <= mid){ cov(L,R,lson,d); } if(R > mid){ cov(L,R,rson,d); } pushup(id); } }tr; int main(){ scanf("%d",&t); for(int i = 1;i <= t;i++){ scanf("%d",&a[i]); } tr.build(1,t,1); scanf("%d",&e); getchar(); int x,y,z; char tpy[3]; for(int i = 1;i <= e;i++){ scanf("%s",&tpy); if(tpy[0] == 'Q'){ scanf("%d%d",&x,&y); printf("%d\n",tr.ask1(x,y,1)); }else if(tpy[0] == 'A'){ scanf("%d%d",&x,&y); printf("%d\n",tr.ask2(x,y,1)); }else if(tpy[0] == 'P'){ scanf("%d%d%d",&x,&y,&z); tr.add(x,y,1,z); }else if(tpy[0] == 'C'){ scanf("%d%d%d",&x,&y,&z); tr.cov(x,y,1,z); } getchar(); } return 0; }
http://www.cnnetsun.cn/news/2853812.html

相关文章:

  • Dubbo的实现原理
  • 公司要求全员学 AI:别只追工具,核心要掌握方法与工作流
  • 蓝桥杯嵌入式备赛避坑指南:从第八届电梯题看状态机设计与调试技巧
  • Windows 10上5分钟搞定EMQX MQTT服务器,叉车本地测试不求人
  • 告别手动复制粘贴!用Wireshark命令行+Python脚本,一键批量提取pcap原始16进制数据
  • 从设计稿到上线:手把手教你用el-table实现高还原度的复杂数据表格(含暗黑模式适配)
  • 保姆级教程:在Win11上搞定MySQL 8.0.28安装与配置(附常见错误排查清单)
  • FusionCompute 8.0 VRM主备部署:从规划IP到登录管理后台的完整配置清单与注意事项
  • 告别Softmax,拥抱Logistic:YOLOv3的多标签分类实战与损失函数调优指南
  • 终于有人整理出了,AI漫剧角色创作全流程:从设定、三视图、表情、动作到提示词
  • 2026成都苹果手机维修性价比推荐:不花冤枉钱的理性选择
  • DocuSign电子签API集成实战:批量发送信封与Webhook回调处理
  • 2026年鹤壁烟酒选购指南:口碑好店真实对比
  • 易连EDI—EasyLink:企业级全场景文件传输管理(MFT)解决方案
  • 通讯管理机之数源系统(一)框架
  • 一个人就是一家公司:200+ AI 专家自动协作,帮你搞定研发、运营和营销
  • 简单易用的进销存该怎么选?分清真易用与功能极简陷阱(2026行业权威标准)
  • js中不会冒泡的事件有哪些?
  • Hybrid AI应用架构设计——WebView+LLM混合开发实践
  • 茶馆主题H5前端静态包|uni-app编译生成,2020风格UI,开箱即用
  • 协议碎片化与性能瓶颈破局:WVP-GB28181-Pro分布式视频管理平台架构深度解析
  • AlistHelper:告别命令行,用图形界面轻松管理Alist文件服务
  • Paperxie 工科代码辅助:AI 一键匹配论文需求生成完整工程源码
  • 【学术干货】清华团队发布RWAI框架:让AI从“能做“到“能落地“,产业应用效率提升50%
  • 线上 Bug 排查与修复实录
  • Android 权限请求构建器使用指南
  • 中小企业做GEO的投入和产出怎么算——从成本、时间线和效果三个方向来看
  • Windows苹果触控板终极指南:免费实现原生级触控体验的完整教程
  • 2026年医学文献AI解读工具热门平台盘点:当循证决策成为医生工作流的新标配
  • 涉及内存指针位运算例题摘要