[ZR] 绝对值划分

news/2024/11/14 18:29:42/文章来源:https://www.cnblogs.com/dcytrl/p/18546552

source:zr 二十联测 day19 C

题意

定义序列 \(\{a_i\}\) 的权值为序列中元素之和的绝对值。

定义一个序列的划分 \(p_1,p_2,\cdots,p_k=n\) 为将序列 \(\{a_i\}\) 划分成了 \([1,p_1],[p_1+1,p_2],\cdots,[p_k+1,n]\)\(k\) 段。定义划分的权值为其划分出来的 \(k\) 个子段的权值的最小值。

\(q\) 次操作,包含单点修改 \(a_i\)、区间查询 \(a_{[l,r]}\) 的划分的最大权值。

\(n,q\le 10^6\)

分析

性质 1:划分的每一段的和一定是正负交替出现。

将两个相邻的、同号的子段合并显然不劣。

性质 2:划分的段数不超过 3。

考虑中间的任意两个相邻的子段 \(i,i+1\),显然 \(i-1,i+2\) 的两个子段正负号不同。不妨令 \(i-1\) 子段和为正。若这两个子段的和为正,则可以跟 \(i-1\) 子段合并;若为负则跟 \(i+2\) 子段合并。

令前缀和数组为 \(s_i\),查询区间为 \((l,r]\)

划分段数为 1 显然。

若划分段数为 2,则我们需要求 \(\max_p \min(|s_p-s_l|,|s_r-s_p|)\)。不难发现当 \(p\) 取到 \(s_p\) 为区间最大值/最小值时最优。

若划分段数为 3,不妨设 \(s_l\le s_r\),令划分方案为 \((l,u],(u,v],(v,r]\)

性质 3: 存在最优解使得第一个子段(令其为 \(b_1\))必定为正。

若其为负,则 \(u\) 取在 \(s_i\) 最小值处最优,此时划分段数为 2 显然不劣。

性质 4:划分点 \(u,v\) 必定满足 \(s_u>s_r,s_v<s_l\)

若不满足,因为三个子段的正负号分别为正负正,则 \(s_u,s_v\) 必定有至少一个在 \([s_l,s_r]\) 内,此时划分段数为 1 更优。

根据性质 4,此时的答案转化成了 \(\min(s_u-s_l,s_r-s_v)\)\(s_u-s_v\) 显然比这两个东西大),由于 \(u<v\),所以此时我们可以考虑枚举分界线指针,让 \(u\) 为左区间最大值,\(v\) 为右区间最小值即可。

发现 \(\min(s_u-s_l,s_r-s_v)\) 是个单峰的东西(前者随指针右移而增大,后者随指针右移而减小),用线段树维护 \(s_i\),在线段树上二分即可。

考虑怎么把复杂度做到一老哥。考虑在线段树上把询问区间拿出来,形成 \(O(\log n)\) 个区间,先在这些区间上面执行上述流程(实际上枚举就行),然后找到一个最优区间,在该区间内线段树上二分即可。

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

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

相关文章

第八课 Python自动化之selenium

python+selenium selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3)…

png图片隐写实例之隐藏二维码

图片隐写,借助的是图片的每个像素点的RGB值,比如取RGB中的B值,这个值的二级制的最低位是0还是1,在肉眼上看看不出丝毫区别,我们就可以利用这个数据位,我们知道二维码一般都是两种颜色,黑色和白色,黑色的像素点用1表示,白色用0表示,我们就把二维码的每个像素点转换成1…

Windows环境安装Scrapy

虽然可以使用 pip 在 Windows 上安装 Scrapy,但还是建议用 Anaconda 安装教程 1.创建虚拟环境(可选但推荐) 打开 Anaconda Prompt,执行以下命令: conda create -n scrapy_env python=3.12(这里假设使用 Python 3.12,你可以根据需要选择其他版本)。 2.激活虚拟环境: co…

openssh 漏洞修复 openssl升级 OpenSSH_9.8p1麒麟系统

第一步:准备好要升级的包 下图所示 使用命令:yum install *.rpm或 rpm -ivh *rpm 如果使用 yum install *.rpm 安装不了,在使用 rpm -ivh *rpm 提示已有旧的版本 可以使用 rpm -Uvh *.rpm 可以替换安装,根据不通的系统 有可能安装后会重启不成功, 所以需要使用:sudo sy…

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同 问题描述 某客户现场支持,由MySQL 5.7.21升级MySQL 8.0.25后,通过LOAD DATA导入文件,当同一会话连续导入不同的编码(UTF8/GB18030)文件时会出现乱码。数据库版本未升级之前,相同的导入操作在MySQL 5.7.21未出现乱码。 问…

用命令行启动 docker 报错:Redirecting to /bin/systemctl start docker.service 解决方法

docker安装成功后,用 sudo service docker start 启动docker报这个错误,看提示应该是需要用systemctl的命令。 使用systemctl start docker命令启动成功了,做下记录。 以下是启动doker常用的几个命令: # 启动 docker:systemctl start docker # 停止 docker:systemctl sto…

CCF - 网易雷火基金项目成果:基于大小模型协同的低资源标注技术|CNCC 2024 演讲实录

在科技蓬勃发展的时代浪潮中,人工智能领域的每一次突破都离不开持续的科研投入和对前沿技术的不懈探索。2023 年,网易伏羲与中国计算机学会(CCF)共同发起了 “CCF - 网易雷火联合基金”,致力于发挥和利用多方资源优势,加强与海内外青年学者的科研合作,促进中国人工智能等…

VisualVM 使用说明

VisualVM 简介:一个轻量级的Java进程监控软件 VisualVM 安装介绍(Mac 使用 brew 安装) ➜ ~ brew uninstall visualvm==> Uninstalling Cask visualvm ==> Backing App VisualVM.app up to /opt/homebrew/Caskroom/visualvm/2.1.10/VisualVM.app ==> Removing App /…

Java方法(四)

设计方法原则:本意为功能块,是实现某个功能语句块的结合,设计方法时保持原子性(一个方法完成一个功能)public class operator {public static void main(String[] args) {int sum = add(1,3);System.out.println(sum);}//加法public static int add(int a,int b){return a…

11.14,python之自动化

python+selenium selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3)…

快来验 踩CTH !!!

题目 别样的,验个数据验成这使样还怎么玩? 谁跟谁的都不一样