POJ3017 Cut the Sequence

news/2024/10/5 13:47:11/文章来源:https://www.cnblogs.com/DeepSeaSpray/p/18287613

POJ3017 Cut the Sequence

题目大意

给定一个一个长度为 \(N\) 的序列 \(A\),要求把该序列划分成若干段,其中每一段中的数的和不大于 \(M\),现在需要使得每一段中数的最大值的和最小,求该最小值。

\[0 \leq n \leq 10^5 \\ 0 \leq m \leq 10^{11} \\ 0 \leq a_i \leq 10^6 \]

解题思路

可以想到动态规划,设 \(f(i)\) 表示考虑前 \(i\) 位的划分时的答案。

容易有状态转移方程:

\[f(i) = \max\{ f(j) + max\{a_{j+1} \dots a_i\} \},(sum\{a_{j+1} \dots a_i\} \leq m) \]

有一个比较显然的性质,\(f\) 是单调不降的。

故我们做出以下思考,设 \(max\{a_{j+1} \dots a_i\} = a_k\),即最大值下标为 \(k\)

那么:

\[\begin{aligned} f(i) &= \max\{f(j) + a_k\} \\ &= \max\{f(j)\} + a_k \end{aligned} \]

根据上面提到的性质,此时,\(j\) 当然越小越好。

总结一下,即,对于 \(a_k = max\{a_{j+1} \dots a_i\}\)\(j\)最小时转移 \(f(i) = f(j) + a_k\)

形象的说,对于 \(a_k\) 我们取其 管辖区间 (即使得其为最大值的区间)的左端点转移。

我们考虑如何求出这些区间。

我们从前往后依次遍历原序列,同时维护一个下降的单调队列,对于其中的 \(q_i\) 其的 管辖区间 即为 \([q_{i-1}+1,i]\),其余的点无法成为最大值,不需要转移。

对于队头元素,其 管辖区间 的左端点即满足转移方程中的条件 \(sum\{a_{j+1} \dots a_i\} \leq m\),这个用前缀和加一个指针就可以做到(利用前缀和的单调性)。

我们得知了队列中的每一个点的 管辖区间 的左端点,用一个 multiset 动态维护(在加入和弹出队列时操作 multiset)。

值得注意的是,队首元素的左端点随 \(i\) 变化,不使用 multiset 维护,单独转移。

参考代码

//#include<bits/stdc++.h>
#include<set>
#include<cstdio>
using namespace std;
#define int long long
const int maxn=1e5;
int n,m;
int a[maxn+5];
int s[maxn+5];
int f[maxn+5];
int q[maxn+5],l,r;
multiset<int> c;
signed main(){int k;scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++)scanf("%lld",&a[i]),s[i]=s[i-1]+a[i];k=0,l=1,r=0;for(int i=1;i<=n;i++){if(a[i]>m){puts("-1");return 0;}while(s[i]-s[k]>m) k++;while(l<=r&&a[q[r]]<=a[i]){if(l<r) c.erase(c.find(f[q[r-1]]+a[q[r]]));r--;}q[++r]=i;if(l<r) c.insert(f[q[r-1]]+a[q[r]]);while(l<=r&&q[l]<=k){if(l<r) c.erase(c.find(f[q[l]]+a[q[l+1]]));l++;}f[i]=f[k]+a[q[l]];if(l<r) f[i]=min(f[i],*c.begin());}printf("%lld",f[n]);return 0;
}

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

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

相关文章

将nodejs迁移到D盘

参考双击安装,指定d盘查看文件夹查看环境变量,自动添加如下Path=D:\software\nodejs\打开cmd验证C:\Users\dogle>node -v v18.14.2C:\Users\dogle>npm -v 9.5.0C:\Users\dogle>echo %PATH% C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\sy…

bluez 入门

**核心模块**:位于系统的最底层,直接与蓝牙硬件进行交互。核心模块实现了蓝牙的基础协议如HCI (Host Controller Interface),并通过DBUS提供API给上层应用。 **服务守护进程(bluetoothd)**:作为系统的守护进程运行,它处理所有的蓝牙服务和配置,如设备配对、连接管理、配…

chrome 浏览器如何设置不保存表单信息

chrome 浏览器如何设置不保存表单信息如何关闭表单自动填充(测试环境Chrome浏览器) https://download.csdn.net/blog/column/7594878/100576004如何禁用谷歌浏览器中的表单自动填充功能? https://zh-cn.fairsyndication.com/222-how-to-disable-form-autofill-in-google-chr…

数字设计--CDC

异步信号与同步信号 同步信号 频率相同,相位相同的两个信号 频率相同,相位差一定的两个信号 不同频率的两个信号也可能是同步的,比如分频出来的两个信号 异步信号 频率不同的两个信号 频率相同但相位差不定的两个信号 跨时钟域就是要解决信号从异步信号之间传输的问题。 亚稳…

数字设计--亚稳态

亚稳态 FPGA 等数字设备中的所有寄存器都定义了信号时序要求----允许每个寄存器在其输入端正确捕获数据并产生输出信号。为确保可靠操作,寄存器的输入必须在时钟边沿之前的最短时间(建立时间 setup time 或 \(t_{su}\))和时钟边沿之后的最短时间(保持时间 hold time 或 \(t…

数字设计--门控时钟与时钟切换

门控时钟(ICG) 使用门控时钟的原因 芯片功耗组成中,大部分是由时钟树消耗掉的。因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟buffer,并且为了最小化时钟延时,它们通常具有很高的驱动强度。此外,即使输入和输出保持不变,接收时钟的触发器也会消耗一定的功耗。…

ComfyUI进阶篇:ComfyUI核心节点(二)

ComfyUI核心节点(二) 前言: 学习ComfyUI是一场持久战。当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点。面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措。在这篇文章中,我们将用通俗易懂的语言对ComfyUI的核心节点进行系统梳理,并详细解释每…

题目集7~8

由于个人原因,最后两次题目集未提交,对自己的放纵感到愧疚,后期的补练我也会抽出时间完成这两道题 经过分析,题目集7,是在前面的基础上加上了一个新概念:互斥开关,以及模拟一种受控窗帘, 在我的想法,互斥开关便可当作两个普通开关去完成电路,窗帘则是新增一个用电器。…

EtherCAT转Profinet网关配置说明第一讲:配置软件安装及介绍

网关XD-ECPNS20为EtherCAT转Profinet协议网关,使EtherCAT协议和Profinet协议两种工业实时以太网网络之间双向传输 IO 数据。适用于具有EtherCAT协议网络与Profinet协议网络跨越网络界限进行数据交换的解决方案。 网关XD-ECPNS20为EtherCAT转Profinet协议网关,使EtherCAT协议…

4、flask-项目拆分

项目的拆分其实就是将app.py中的工作拆分开来、类似Django一样、每个项目都把路由模板和试图函数分开写 app.py # 路由 + 视图函数from flask import Blueprint from models import *#蓝图 # 创建蓝图对象 # 第一个参数:蓝图的名字 # 第二个参数:蓝图的包名 blue = Blueprin…

2-SAT 问题

2-SAT 问题 模型有 \(n\) 个布尔类型的变量 \(x_1, x_2, \ldots, x_n\),有 \(m\) 条限制形如 \(x_i \space [\operatorname{or}/\operatorname{and}]\space x_j=[1/0]\). 求一组符合要求的解。核心问题只需要考虑有没有解。 对于每个变量都只有两种取值:\(0/1\),那么把每…

坚果云与floccus实现Chrome书签国内跨设备、跨平台同步

本文介绍基于floccus插件与坚果云协同使用的方法,对浏览器的书签进行实时在线同步的操作~本文介绍基于floccus插件与坚果云协同使用的方法,对浏览器的书签进行实时在线同步的操作。在工作与学习中,我们时常希望在不同浏览器之间实现书签的同步;而一些传统的浏览器书签同步方…