bzoj4639 博士的选取器
题意
给出一个长度为n的正整数序列,要求把它划分成若干个连续的区间,使得每个区间的数字之和都不超过给定的lim.最后的代价等于每个区间的最大值之和.求最小代价.n<=300000
分析
定义f[i]表示前i个数划分成若干个区间的最小代价,一眼是个1D1D动态规划,猜测有决策单调性,打表发现并没有.然后也看不出什么很妙的性质.
感觉分治也许能做,推一推发现确实可以.定义solve(l,r)处理f[l...mid]到f[mid+1...r]的转移,按照最大值在左边/右边分两种情况处理,都可以线性解决.递归时要先solve(l,mid),然后处理[l,mid]到[mid+1,r]的转移,再solve(mid+1,r).细节见代码,不是很难写.
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=300006;
typedef long long ll;
int n;ll lim;
ll f[maxn];
ll pre[maxn],a[maxn];
ll Min[maxn],Max[maxn],mark[maxn];
void gmin(ll &a,ll b){
if(a>b)a=b;
}
void solve(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
solve(l,mid);
Min[mid]=f[mid];Max[mid]=a[mid];
for(int i=mid-1;i>=l;--i)Min[i]=min(Min[i+1],f[i]),Max[i]=max(Max[i+1],a[i]);
Max[mid+1]=a[mid+1];
for(int i=mid+2;i<=r;++i)Max[i]=max(Max[i-1],a[i]);
int L=l,pt=mid+1;
for(int i=mid+1;i<=r;++i){
while(pre[i]-pre[L]>lim)L++;
while((pt-1)>l&&Max[pt-1]<=Max[i])--pt;
if(L>mid)break;
gmin(f[i],Max[i]+Min[max(pt-1,L)]);
}
for(int i=mid+1;i<=r;++i)mark[i]=(1ll<<60);
int R=r;pt=mid;
for(int i=mid;i>l;--i){
while(pre[R]-pre[i-1]>lim)R--;
if(R<=mid)break;
while(pt+1<=r&&Max[pt+1]<=Max[i])++pt;
if(pt>mid){
gmin(mark[min(pt,R)],f[i-1]+Max[i]);
}
}
for(int i=r;i>=mid+1;--i){
gmin(f[i],mark[i]);
gmin(mark[i-1],mark[i]);
}
solve(mid+1,r);
}
int main(){
scanf("%d%lld",&n,&lim);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
pre[i]=pre[i-1]+a[i];
}
for(int i=1;i<=n;++i){
if(pre[i]<=lim)f[i]=max(a[i],f[i-1]);
else f[i]=1ll<<60;
}
solve(1,n);
printf("%lld\n",f[n]);
return 0;
}
bzoj4639 博士的选取器的更多相关文章
- UIDatePicker日期选取器
//定义显示日期的格式 NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init]; //NSDateFormatterMediumStyl ...
- Windows Store App JavaScript 开发:文件选取器
正如前面章节C#语言中所介绍的,文件选取器是应用与系统进行交互的一个接口,通过文件选取器可以在应用中直接与文件系统进行交互,访问不同位置的文件或文件夹,或者将文件存储在指定位置.文件选取器分为对文件进 ...
- 【WP 8.1开发】文件选取器的使用方法
在以往的WP7x/8.0开发中,我们使用选择器可以浏览并打开图片.音频.视频等一些特殊文件,在8.0 SDK中的运行时API(从Win 8 app中移植)尽管提供了Windows.Storage.Pi ...
- UIDatePicker 日期/时间选取器(滚轮)—IOS开发
UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期.时间和持续时长的输入.日期选取器的各列会按照指定的风格进行自动配置,这样 ...
- Windows Store App 文件选取器
使用文件选取器可以访问除上面介绍的"应用程序存储"和"用户库"两个位置之外的本地文件或者文件夹.文件选取器是应用与系统进行交互的一个接口,通过文件选取器可以在应 ...
- IOS开发—UIDatePicker 日期/时间选取器(滚轮)
UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期.时间和持续时长的输入.日期选取器的各列会按照指定的风格进行自动配置,这样 ...
- iOS开发-分页栏和选取器的使用
一.分页栏 创建一个新的项目,Subclass of的值选中UIViewController,然后在storyboard中删除根视图,在右下方拖出一个Tab Bar Controller 新增分页,只 ...
- 重新想象 Windows 8 Store Apps (28) - 选取器: CachedFileUpdater(缓存文件更新程序)
原文:重新想象 Windows 8 Store Apps (28) - 选取器: CachedFileUpdater(缓存文件更新程序) [源码下载] 重新想象 Windows 8 Store App ...
- 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口
原文:重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口 [源码下载] 重新想象 Windows 8 Store Apps (27) - ...
随机推荐
- 20155325 加分作业 实现pwd
要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 准备 思路 问题 1.如何获取当前目录的节点号 Linux ...
- 20155328 2016-2017-2 《Java程序设计》 第十周学习内容总结
20155328 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 JAVA和ANDROID开发学习指南 第22章 网络概览 两台计算机用于通信的语言叫做&qu ...
- nohub用法
在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...
- python3出现转码问题的总结
对于此(类)问题: (1)出现UnicodeEncodeError –> 说明是Unicode编码时候的问题: (2) ‘gbk’ codec can’t encode character –& ...
- python 多线程笔记(3)-- 线程的私有命名空间
线程的私有命名空间实现: threading_namespace = threading.local() import threading import time import random thre ...
- SaltStack入门篇(五)之salt-ssh的使用以及LAMP状态设计部署
1.salt-ssh的使用 官方文档:https://docs.saltstack.com/en/2016.11/topics/ssh/index.html ()安装salt-ssh [root@li ...
- mongod 安装
mongod --logpath F:\mongo\db\logs\logs.log --logappend --dbpath F:\mongo\db\data --directoryperdb -- ...
- Python中的装饰器的使用及固定模式
装饰器的使用: 在不想修改函数的调用方式,但是想给函数添加内容的功能的时候使用 为什么使用装饰器: 软件实体应该是可扩展,而不可修改的.也就是说,对扩展是开放的,而对修改是封闭的. 因此,引出 ...
- 准备正式开始学习C++,先发点牢骚
由于职业关系,经常使用AutoCAD之类绘图软件,但这些软件平台的功能,对专业的应用细节来说,并不能全都照顾到,需要一些二次开发,提升一些个性化操作的效率.软件本身也大多提供了开发软件包,AutoCA ...
- testNG-失败用例重跑机制
下面简单介绍下testNG的失败重跑的实现方法: 1.首先编写一个类,实现IRetryAnalyzer类,重写其中的retry方法. public class TestNGRetry implemen ...