CF1918D Blocking Elements 题解
如果你做过以下两道题目,那么这道题对你来说会简单得多。
由于题目要求最大值的最小值,考虑二分。
如果我们使用 \(x\) 的费用划分了整个数列,那么我们同样也可以使用比 \(x\) 更多的费用划分这个数列,因为划分方式不用进行改变。所以满足二分条件,可以二分。
考虑二分之后如何让判断是否可以划分整个序列。当我们选择隔断一个数时,会对已经选出的数的总和造成影响。由于这个影响,我们发现很难对这个问题进行贪心判定,所以考虑动态规划。
由于一般的动态规划方式很难对上一个隔断的位置进行维护,所以需要状态中包含位置信息。有一种经典的解决方式,设状态 \(dp[i]\) 表示隔断第 \(i\) 个元素,使前 \(i-1\) 个元素满足条件的最小隔断元素之和,这样每个状态就包含了位置信息。然而,由于最后一个元素并不一定要被隔断,所以统计答案时要将所有在 \(i\) 处隔断后,不再进行隔断,最后一段之和小于当前二分答案值的位置 \(dp[i]\) 都统计进去,求最小值。
设 \(a_i\) 表示数列中的 \(i\) 个元素的值,\(s_i\) 为数列 \(a\) 的前缀和,\(k\) 为二分当前值。根据状态定义,很容易推出以下转移方程:
\]
经过观察,我们发现每次可以转移的状态是根据位置减少的,且每次补充一个新的元素,这是很经典的单调队列优化动态规划的应用模型。使用单调队列维护可转移集合,即可做到 \(O(n)\) 求出所有 \(dp[i]\) 的值。
于是,我们就以 \(O(n\log n)\) 的时间复杂度解决了这个问题。
#include <bits/stdc++.h>
using namespace std;
long long t,n,a[300000],s[300000],f[300000];
long long v[300000],p[300000],q=1,h=0;
bool check(long long now)
{
long long ans=1e15;
for(int i=1;i<=n;i++)f[i]=1e15;
q=1,h=0;
v[++h]=0,p[h]=0;
for(int i=1;i<=n;i++)
{
while(s[i-1]-p[q]>now&&q<=h)q++;
f[i]=v[q]+a[i];
while(f[i]<=v[h]&&q<=h)h--;
v[++h]=f[i],p[h]=s[i];
}
for(int i=n;i>=0;i--)
{
if(s[n]-s[i]>now)break;
ans=min(ans,f[i]);
}
return ans<=now;
}
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
long long l=1,r=1e15,ans=0;
while(l<=r)
{
long long mid=(l+r)>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
printf("%lld\n",ans);
}
return 0;
}
CF1918D Blocking Elements 题解的更多相关文章
- C#版(打败99.28%的提交) - Leetcode 347. Top K Frequent Elements - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- CF177A1/A2 Good Matrix Elements 题解
Content 给定一个 \(n\times n\) 的矩阵,每个元素都有一个值,求出处于两条对角线以及中间行和中间列的元素之和. 数据范围:\(1\leqslant n\leqslant 5(\te ...
- 【HackerRank】Find the Median(Partition找到数组中位数)
In the Quicksort challenges, you sorted an entire array. Sometimes, you just need specific informati ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- 算法与数据结构基础 - 链表(Linked List)
链表基础 链表(Linked List)相比数组(Array),物理存储上非连续.不支持O(1)时间按索引存取:但链表也有其优点,灵活的内存管理.允许在链表任意位置上插入和删除节点.单向链表结构一般如 ...
- jQuery BlockUI Plugin Demo
1.Login Form $(document).ready(function() { $('#demo1').click(function() { $.blockUI({ message: $('# ...
- 一道算法题,引出collections.Counter的特殊用法
题目描述: 题目编号:1002. 查找常用字符 给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表.例如,如果一个字符在每个字符串中出现 3 次, ...
- 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)
有时候,很简单的模板题,可能有人没有做出来,(特指 I ),到时候一定要把所有的题目全部看一遍 目录 B 题解 E F 题解 H I 题解&代码 J B 输入样例 3 2 1 2 1 2 3 ...
- LeetCode Minimum Moves to Equal Array Elements II
原题链接在这里:https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目: Given a non-empt ...
随机推荐
- Kylin-Server-V10-SP3物理机安装简要过程
1.下载镜像 链接: https://eco.kylinos.cn/partners/mirror.html?class_id=1&query_key=V10 选择: 银河麒麟高级服务器操作系 ...
- java基础之集合(List)、Properties集合
一.ArrayList集合的方法 1.public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上. 2.public E get(int ...
- AI Agent现实应用与未来展望:从个人到社会的变革(下篇)
认知是成本最低的对冲. --张三思维进化论 从理论到实践:Agent技术落地的关键时刻 在前两篇文章中,我们探讨了AI Agent的概念认知和技术原理: 从"被动对话"到" ...
- Nacos源码—6.Nacos升级gRPC分析一
大纲 1.Nacos 2.x版本的一些变化 2.客户端升级gRPC发起服务注册 3.服务端进行服务注册时的处理 4.客户端服务发现和服务端处理服务订阅的源码分析 1.Nacos 2.x版本的一些变化 ...
- django实例(1)
Urls.py from django.contrib import adminfrom django.conf.urls import urlfrom cmdb import viewsurlpat ...
- Qt项目转Visual Studio项目
有时觉得在Qt中调试代码不够方便,无法调试更深层次的参数,故需要将Qt项目转为Visual Studio项目. 方法:qmake -tp vc Hello.pro 以上命令会将名为Hello的Qt工程 ...
- 企业级MediaWiki知识库系统搭建部署指南(CentOS 8)
## 一.高级环境准备 ### 1. 系统优化与安全加固 ```bash # 系统更新与内核优化 sudo dnf update -y --security sudo dnf install kern ...
- [原创]《C#高级GDI+实战:从零开发一个流程图》第02章:画一个矩形,能拖动!
一.前言 就像开发的教程都从"Hello World!"开篇一样,系列开始,我们也从一个最最简单的功能开始:画一个能拖动的矩形. 顺便说一下,另一篇教程:(原创)[C#] GDI+ ...
- mybatis下的ResultMap配置一对一以及一对多
一对一: 在数据库里面有这样的一个主外键关系的表: 我需要查找身份证的号码就要知道这个人的姓名(通过一个SQL语句要查到两个实体类里面的信息): SELECT c.*,p.* FROM idcard ...
- JIT 编译优化原理深度解析
在 Java 高级程序员面试中,JIT(即时编译,Just-In-Time Compilation)作为提升程序执行效率的核心技术,是 JVM 原理模块的高频考点.本文从 JIT 架构设计.热点代码识 ...