题解:CF1918D(D. Blocking Elements)

题解:CF1918D(D. Blocking Elements)

一、 读题

1. 题目链接

(1) 洛谷链接

洛谷链接

(2) CF链接

CF链接

2. 题意简述

已知一个长度为 n n n 的数组 a a a,构造一个数组 b b b(记其长度为 m m m),使得代价最小。代价为①和②的最大值。
① = ∑ i = 1 n a b i ①=\sum_{i=1}^{n}a_{b_i} =i=1nabi
② = max ⁡ 0 ⩽ i ⩽ m ∑ j = b i + 1 b i − 1 + 1 a j ②=\max_{0\leqslant i\leqslant m}\sum_{j=b_{i}+1}^{b_{i-1}+1}a_j =0immaxj=bi+1bi1+1aj
这里,我们规定 b 0 = b n + 1 = 1 b_0=b_{n+1}=1 b0=bn+1=1

二、 分析

本题 n n n 1 0 5 10^5 105 数量级,是标准的 O ( n ⋅ l o g 2 ( n ) ) O(n·log_{2}(n)) O(nlog2(n)) 题。

三、 知识

二分答案+动态规划+前缀和+单调队列优化。

四、 思路

由于本题需要同时保证两个量(①和②)最优,所以一定是确定其中一个,并用已知的这一个去求未知的。我们不难想到,可以已知②求①。这里我们利用可行性进行二分答案,即通过 j u d g e judge judge 函数判断在保证②最大为 n u m num num 的情况下能得到的最小的①是否比 n u m num num 小,用二分答案找到“行”与“不行”的分界点。

那么如何验证呢?

我们不难想到动态规划——定义 f i f_{i} fi 为考虑 a a a 中的前 i i i 个数,保证②不超过 n u m num num,并且选择了 a i a_i ai,在这种情况下①的最小值。

转移也不难,对于 f i f_{i} fi,我们在从 1 1 1 i − 1 i-1 i1 的范围内选择一个 j j j,使得从 ∑ k = j i a k \sum_{k=j}^ia_k k=jiak 不超过 n u m num num,这样 f i f_i fi 就可以从所有 f j f_j fj 加上 1 1 1 转移,当然这里是求最小值。但是遍历的代价是平方级的,所以这里用前缀和+单调队列优化。

为了方便计算和统计答案,我们定义 a 0 = a n + 1 = 0 a_0=a_{n+1}=0 a0=an+1=0,这样显然不会影响最终的结果。现在要考虑初始值(边界值)。显然, f 0 = 0 f_0=0 f0=0。最终的答案(这里指的是验证中①的最小值)就是 f n + 1 f_{n+1} fn+1,这样既考虑了 1 1 1 n n n 的所有数,有没有必须选择 1 1 1 n n n 中某一个的限定。

验证的返回值就是最小的①是否不超过 n u m num num

五、 编码

··
#include<bits/stdc++.h>
#define N 110000
using namespace std;
long long f[N]={},s[N]={};
int a[N]={},q[N]={},n=0,t=0;
bool judge(long long num);
int main(){scanf("%d",&t);while(t--){scanf("%d",&n);a[0]=0;s[0]=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]+a[i];}a[n+1]=0;s[n+1]=s[n];long long l=0,r=s[n]+1;while(l+1<r){long long mid=(l+r)/2;if(judge(mid)==false){l=mid;}else{r=mid;}}printf("%lld\n",r);}return 0;
}
bool judge(long long num){for(int i=1;i<=n+1;i++){f[i]=0;}int front=1,rear=0;rear++;q[rear]=0;f[0]=0;for(int i=1;i<=n+1;i++){while(front<=rear&&s[i-1]-s[q[front]]>num){front++;}f[i]=f[q[front]]+a[i];while(front<=rear&&f[q[rear]]>f[i]){rear--;}rear++;q[rear]=i;}if(f[n+1]<=num){return true;}return false;
}

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

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

相关文章

Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧

技术背景 我们在做Android平台GB28181设备对接模块的时候&#xff0c;遇到这样的技术需求&#xff0c;开发者希望能以后台服务的形式运行程序&#xff0c;国标平台侧没有视频回传请求的时候&#xff0c;仅保持信令链接&#xff0c;有发起视频回传请求或语音广播时&#xff0c;…

数字孪生网络攻防模拟与城市安全演练

在数字化浪潮的推动下&#xff0c;网络攻防模拟和城市安全演练成为维护社会稳定的不可或缺的环节。基于数字孪生技术我们能够在虚拟环境中进行高度真实的网络攻防模拟&#xff0c;为安全专业人员提供实战经验&#xff0c;从而提升应对网络威胁的能力。同时&#xff0c;在城市安…

71.Spring和SpringMVC为什么需要父子容器?

71.Spring和SpringMVC为什么需要父子容器&#xff1f; 就功能性来说不用子父容器也可以完成&#xff08;参考&#xff1a;SpringBoot就没用子父容器&#xff09; 1、所以父子容器的主要作用应该是划分框架边界。有点单一职责的味道。service、dao层我们一般使用spring框架 来…

Qt 进程守护程序

Qt 进程守护程序 简单粗暴的监控&#xff0c;方法可整合到其他代码。 一、windows环境下 1、进程查询函数 processCount函数用于查询系统所有运行的进程中该进程运行的数量&#xff0c;比如启动了5个A进程&#xff0c;该函数查询返回的结果就为5。 windows下使用了API接口查询…

GEE数据集——全球健康地图项目Global Healthsites Mapping Project

Global Healthsites Mapping Project Healthsites.io和全球健康网站绘图项目的使命是帮助向政府、非政府组织和私营部门提供准确的最新健康设施信息。医疗机构登记簿是一个国家内运作良好的医疗信息系统的基石。准确和最新的数据提供了基础数据&#xff0c;有助于推动服务可用…

5分钟掌握接口自动化测试,4个知识点简单易学!

一. 什么是接口测试 接口测试是一种软件测试方法&#xff0c;用于验证不同软件组件之间的通信接口是否按预期工作。在接口测试中&#xff0c;测试人员会发送请求并检查接收到的响应&#xff0c;以确保接口在不同场景下都能正常工作。 就工具而言&#xff0c;常见的测试工具有…

16-Verilog实现二线制I2C CMOS串行EEPROM的读写操作

Verilog实现二线制I2C CMOS串行EEPROM的读写操作 1&#xff0c;二线制I2C CMOS串行EEPROM的简单介绍2&#xff0c;I2C总线特征介绍3&#xff0c;二线制I2C、CMOS串行EEPROM的读写操作4&#xff0c;EEPROM的Verilog HDL程序4.1&#xff0c;EEPROM的行为模型思路如下&#xff1a;…

【Kotlin】Kotlin环境搭建

1 前言 Kotlin 是一种现代但已经成熟的编程语言&#xff0c;由 JetBrains 公司于 2011 年设计和开发&#xff0c;并在 2012 年开源&#xff0c;在 2016 年发布 v1.0 版本。在 2017 年&#xff0c;Google 宣布 Kotlin 正式成为 Android 开发语言&#xff0c;这进一步推动了 Kotl…

【Go】一、Go语言基本语法与常用方法容器

GO基础 Go语言是由Google于2006年开源的静态语言 1972&#xff1a;&#xff08;C语言&#xff09; — 1983&#xff08;C&#xff09;—1991&#xff08;python&#xff09;—1995&#xff08;java、PHP、js&#xff09;—2005&#xff08;amd双核技术 web端新技术飞速发展&…

揭秘可解释性AI:构建信任的桥梁

--- ### 揭秘可解释性AI&#xff1a;构建信任的桥梁 在当前人工智能技术的迅猛发展中&#xff0c;可解释性AI&#xff08;XAI&#xff09;逐渐成为推动技术透明度和增强人机信任的重要工具。XAI旨在解开AI决策过程的“黑箱”&#xff0c;使机器的思考过程更加透明和可理解。本…

【Python程序开发系列】聊一聊github的pull request几种合并方式

一、什么是PR 在正常的工作流程中&#xff0c;PR 用于将一个分支的更改合并到另一个分支&#xff0c;而这些更改通常以提交的形式存在。每个提交都有一个唯一的提交 ID&#xff0c;用于标识和跟踪更改的历史。因此一般情况下PR包含源分支的多个commit提交记录&#xff08;pr_co…

数据结构_找环,破环题-2.5

一. 判断单链表有无环 a. 错误的思路&#xff1a;遍历陷入死循环 1&#xff09;和相交的遍历思路一样&#xff0c;找指向相同。 错误点 一直在死循环。 思考点&#xff1a;如何破环 b. 个人思路&#xff1a;反转链表回首结点 1&#xff09;目前的经验&#xff0c;无非就…

无人机集群协同导航构型自适应选择算法

无人机集群协同导航构型自适应选择算法 Evandworld E-mail&#xff1a;evandworldfoxmail.com 摘要 针对卫星定位系统用于无人机集群时成本高、精度低等问题&#xff0c;本文提出一种基于卡尔曼滤波和概率的无人机集群构型自适应选择算法。在自适应扩展卡尔曼滤波的基础上&a…

kubernetes部署nacos2.3.0

一、nacos简介 nacos官网地址 简单易用 动态配置管理、服务发现和动态的一站式解决方案&#xff0c;20多种开箱即用的以服务为中心的架构特性&#xff0c;基本符合生产要求的轻量级易用控制台。 更适应云架构 无缝支持 Kubernetes 和 Spring Cloud&#xff0c;在主流公共云上…

Qt:QFileDialog

目录 一、介绍 二、功能 三、具体事例 1、将某个界面保存为图片&#xff0c;后缀名可选PNG、JPEG、SVG等 一、介绍 QFileDialog提供了一个对话框&#xff0c;允许用户选择文件或者目录&#xff0c;也允许用户遍历文件系统&#xff0c;用以选择一个或多个文件或者目录。 QF…

Debezium发布历史111

原文地址&#xff1a; https://debezium.io/blog/2021/10/07/incremental-snapshots/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Incremental Snapshots in Debezium October 7, 2021 by Jiri Pechanec mys…

linux虚拟机升级g++编译器版本

原先的 更新你的软件包列表&#xff1a; sudo apt update 添加Ubuntu Toolchain PPA&#xff08;Personal Package Archive&#xff09;&#xff0c;这是一个提供较新编译器版本的第三方软件源&#xff1a; sudo add-apt-repository ppa:ubuntu-toolchain-r/test 再次更新软件包…

LDAR管理系统解决方案

1、密封点数量不准确 工业企业LDAR项目多委托第三方进行检测&#xff0c;由于前几年由于检测费较高&#xff0c;为减少开支&#xff0c;很多企业只安排检测公司检测了部分密封点&#xff0c;造成密封点遗漏。也有少数企业为了从中谋私利&#xff0c;虚增密封点。 2、密封点台账…

Tokitsukaze and Short Path (plus minus)

一、Tokitsukaze and Short Path (plus) 解析&#xff1a; 容易知道 对于 u 和 v 两点之间的距离是 2*max(a[u],a[v]),同时这也是这两个点的最短距离&#xff0c;因为如果想要绕路的话&#xff0c;就必须再至少经过一个点&#xff0c;这样的话&#xff0c;就会使得两者的距离变…

RTthread线程间通信(邮箱,消息队列,信号/软件中断)---02代码分析邮箱和消息队列

RT-Thread代码分析 这是源码分析, 实际使用看这个 信号看这个 看这一篇之前最好看一下我的RT-Thread对象管理以及线程管理, 时钟管理 邮箱 实际是实现是一个对环形缓存区的使用 struct rt_mailbox {struct rt_ipc_object parent; /**< inherit from…