P4314 CPU 监控(区间历史最值)

news/2025/3/21 23:01:07/文章来源:https://www.cnblogs.com/XP3301Pipi/p/18786035

P4314 CPU 监控(区间历史最值)

Description

维护一个长度为 \(n\) 的序列 \(A\),初始所有位置都是 \(0\)

\(Q\) 次操作:

  • Q X Y:询问 \(A[X,Y]\) 的 $ \max$。
  • A X Y:询问 \(A[X,Y]\) 的历史 \(\max\)
  • P X Y Z\(A[X,Y]\) 全部加上 \(Z\)
  • C X Y Z\(A[X,Y]\) 全部变为 \(Z\)

\(1\leq n,Q\leq 10^5\)

Solution

由于需要维护历史最值,我们需要在线段树节点上用 lazy tag 刻画出一个 “操作序列”。

可以看出,当一个节点有了覆盖标记时,之后的加操作可以看作把这个覆盖标记的值增加 \(Z\)

那么一个节点的 “操作序列” 就可以被刻画为 “加操作+覆盖操作”。

我们需要在线段树节点上再另外维护三个值 his,mxd,mxc,分别表示这个节点的历史最大值、加标记的历史最大值、覆盖标记的历史最大值。

下放标记细节较多,需要注意各个标记的优先级。

int n,Q,a[N];struct Segtr{int val,his;int add,mxd,cov,mxc,tag;
}tr[N<<2];void Pushup(int p){tr[p].val=max(tr[p<<1].val,tr[p<<1|1].val);tr[p].his=max(tr[p<<1].his,tr[p<<1|1].his);
}void Buildtr(int p,int l,int r){tr[p].val=tr[p].his=-IINF;tr[p].mxd=tr[p].mxc=-IINF;if(l==r){tr[p].val=tr[p].his=a[l];return;}int mid=(l+r)>>1;Buildtr(p<<1,l,mid);Buildtr(p<<1|1,mid+1,r);Pushup(p);
}void WorkAdd(Segtr &p,Segtr &s){Ckmax(s.his,s.val+p.mxd);s.val+=p.add;if(s.tag){Ckmax(s.mxc,s.cov+p.mxd);s.cov+=p.add;}else{Ckmax(s.mxd,s.add+p.mxd);s.add+=p.add;}
}void WorkCov(Segtr &p,Segtr &s){if(!p.tag) return;Ckmax(s.his,p.mxc);s.val=p.cov;Ckmax(s.mxc,p.mxc);s.cov=p.cov;s.tag=1;
}void Spread(int p){WorkAdd(tr[p],tr[p<<1]);WorkAdd(tr[p],tr[p<<1|1]);WorkCov(tr[p],tr[p<<1]);WorkCov(tr[p],tr[p<<1|1]);tr[p].tag=tr[p].add=tr[p].cov=0;tr[p].mxc=tr[p].mxd=-IINF;
}void Update(int p,int l,int r,int L,int R,int d){if(L<=l&&r<=R){if(tr[p].tag){tr[p].cov+=d;Ckmax(tr[p].mxc,tr[p].cov);}else{tr[p].add+=d;Ckmax(tr[p].mxd,tr[p].add);}tr[p].val+=d;Ckmax(tr[p].his,tr[p].val);return;}Spread(p);int mid=(l+r)>>1;if(L<=mid) Update(p<<1,l,mid,L,R,d);if(R>mid) Update(p<<1|1,mid+1,r,L,R,d);Pushup(p);
}void Cover(int p,int l,int r,int L,int R,int d){if(L<=l&&r<=R){tr[p].cov=d;Ckmax(tr[p].mxc,d);tr[p].val=d;Ckmax(tr[p].his,d);tr[p].tag=1;return;}int mid=(l+r)>>1;Spread(p);if(L<=mid) Cover(p<<1,l,mid,L,R,d);if(R>mid) Cover(p<<1|1,mid+1,r,L,R,d);Pushup(p);
}int AskVal(int p,int l,int r,int L,int R){if(L<=l&&r<=R) return tr[p].val;int mid=(l+r)>>1,res=INT_MIN;Spread(p);if(L<=mid) Ckmax(res,AskVal(p<<1,l,mid,L,R));if(R>mid) Ckmax(res,AskVal(p<<1|1,mid+1,r,L,R));return res;
}int AskHis(int p,int l,int r,int L,int R){if(L<=l&&r<=R) return tr[p].his;int mid=(l+r)>>1,res=INT_MIN;Spread(p);if(L<=mid) Ckmax(res,AskHis(p<<1,l,mid,L,R));if(R>mid) Ckmax(res,AskHis(p<<1|1,mid+1,r,L,R));return res;
}signed main(){read(n);for(int i=1;i<=n;i++) read(a[i]);Buildtr(1,1,n);read(Q);while(Q--){char op[3];int l,r,v;scanf("%s",op);read(l),read(r);if(op[0]=='Q') printf("%lld\n",AskVal(1,1,n,l,r));if(op[0]=='A') printf("%lld\n",AskHis(1,1,n,l,r));if(op[0]=='P'){read(v);Update(1,1,n,l,r,v);}if(op[0]=='C'){read(v);Cover(1,1,n,l,r,v);}}return 0;
}

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

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

相关文章

Vue3 slot

6.9. 【slot】 1. 默认插槽父组件中:<Category title="今日热门游戏"><ul><li v-for="g in games" :key="g.id">{{ g.name }}</li></ul></Category> 子组件中:<template><div class="item&…

英语四级计划第三天

第三天 单词阅读 Smaller Museums From Niche to Mainstream “小而精”的小众博物馆,正在出圈出彩 Chinas museum boom has continued to rise, leading to increased attention and visibility for smaller but more specialized museums. 中国的博物馆热潮持续升温,导致规…

今日总结(app链接数据库的简单实现以及AI训练学习)

所花时间:145min 代码量(行):120 博客量:14 了解到的知识点: 今天又到了周五了,如同往常一样下午进行自学测试,今天是实现一个app数据库连接 在手机上进行查询显示的任务。 因为对于AS开发我并没有进行系统的学习,只是知道大体的框架和对AI进行训练,但是 我发现了一个…

学嵌入式C语言,看这一篇就够了(6)

C语言的语句和块 C语言标准中一共提供6种语句 注意:C语言中的语句要指明执行的操作,并且没有特殊情况,语句是按照顺序执行的一般把实现某些功能的语句整合在一起,构成一个语法单元,C语言标准的语法单元也被称为块,也被称为块语句 复合语句 复合语句可以限制语句的作用范围…

P3375 【模板】KMP

P3375 【模板】KMP 题目描述 给出两个字符串 \(s_1\) 和 \(s_2\),若 \(s_1\) 的区间 \([l, r]\) 子串与 \(s_2\) 完全相同,则称 \(s_2\) 在 \(s_1\) 中出现了,其出现位置为 \(l\)。 现在请你求出 \(s_2\) 在 \(s_1\) 中所有出现的位置。 定义一个字符串 \(s\) 的 border 为 …

Cursor 使用教程

目录核心功能TabAICHATCOMPOSER@DocsWebGitNotepadCodebase技巧和思路如果Cursor乱改代码怎么办? 核心功能 Tab 这个是Cursor最为强大的功能,使用也很简单,在编写代码的时候,如果出现了灰色的提示词,直接按Tab就可以自动补全了最后的灰色的就是提示词 Cursor的光标预测也很…

C语言学习打卡第二天(2025.3.21)

时间有点少,今天也没学多少,只把指针基础概念学了一下(例如指针变量,下标法等),题也只做了三道。

3.21 学习记录

设计科技查询手机端系统,实现了政策关键字进行模糊匹配查询,点击下方的政策名称,可以打开新窗口,显示政策全文,实现分页查询,分类查询 采用springboot+vue3实现

P8436 【模板】边双连通分量

P8436 【模板】边双连通分量 题目描述 对于一个 \(n\) 个节点 \(m\) 条无向边的图,请输出其边双连通分量的个数,并且输出每个边双连通分量。 输入格式 第一行,两个整数 \(n\) 和 \(m\)。 接下来 \(m\) 行,每行两个整数 \(u, v\),表示一条无向边。 不保证图为简单图,图中可…

SvelteKit 最新中文文档教程(8)—— 部署 Node 服务端

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

第四篇:本地私有化部署大模型(Ollama、vLLM、LMDeploy)

魔塔社区平台介绍 量化:将高精度数值转换成低精度表示的过程(通常用于减少模型的内存和提高推理速度) Ollama部署大模型 linux安装miniconda# 下载 Miniconda 安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # 运行安装脚本 bash…