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 ...
随机推荐
- adb环境配置笔记
adb环境配置不需要先配置好jdk,然后配置adb环境,才能命令行运行adb https://blog.csdn.net/shengmer/article/details/79027828 https ...
- lua随写
--local util={}--function util.Split(str, sep)-- local sep, fields = sep or ":", {}-- loca ...
- rabbitmq防止消息的重复消费
一.rabbitmq出现消息重复的场景 A:消息消费成功,事务已经提交,ack时,机器宕机,导致没有ack成功, Broker的消息重新由unack变为ready,并发送给其他消费者 B:消息消费失败 ...
- MySQL 中 AUTO_INCREMENT 列达到最大值时会发生什么?
在MySQL中,AUTO_INCREMENT列用于自动生成唯一的数字值,通常用于主键.当AUTO_INCREMENT列达到最大值时,会发生以下几种情况,具体取决于列的数据类型以及MySQL的配置. 对 ...
- 【HUST】网安|操作系统实验|实验一 内核编译、系统调用、编写批处理脚本
文章目录 目的 任务 前言 一.linux内核编译 非常靠谱的两篇参考文章: 补注: 总结 二.添加新的系统调用 特别靠谱的参考文章: 补注: 1. 我修改的文件: 2. 图中需要敲入的全部代码: 3 ...
- P2779 [AHOI2016初中组] 黑白序列题解
题意: 小可可准备了一个未完成的黑白序列,用 B 和 W 表示黑色和白色,用 ? 表示尚未确定. 他希望知道一共有多少种不同的方法,在决定了每一个 ? 位置的颜色后可以得到一个小雪喜欢的黑白序列. 其 ...
- Python基础 - 多线程(上)
前面对 进程 一点认识, 通俗理解, 进程是操作系统(OS)进行资源调度分配的基本单元. 每个程序的至少就一个进程在OS中被"监控"着的哦. 然后围绕着多进程, 用消息队列共享全局 ...
- C#之BitConverter.ToInt16
byte[] bytes = { 1,3 }; short s = BitConverter.ToInt16(bytes,0); Console.WriteLine(s); 从低位到高位填充: 000 ...
- Partition to K Equal Sum Subsets——LeetCode进阶路
原题链接https://leetcode.com/problems/partition-to-k-equal-sum-subsets/ 题目描述 Given an array of integers ...
- odoo14本地windows安装报错汇总
odoo14安装libsass报错C++啥的解决办法:pip install wheel: pip install libsass-0.20.1-......whl 注意:whl版本应与python版 ...