题目大意:给定一个长度为 N 的序列,将序列划分成若干段,保证每段之和不超过 M,问所有段的最大值之和最小是多少。

题解:设 \(f[i]\) 表示前 i 个数满足上述条件的最优解,显然有状态转移方程$$f[i]=min{f[j]+max_{j+1\le k \le i}{a[k]}}$$,发现若能够在 \(O(1)\) 的时间内求得静态区间最小的 a 值,则时间复杂度为 \(O(n^2)\)。

可以发现,这个算法复杂度的瓶颈是每次都需要枚举 j 来做状态转移,于是观察递推式的结构,由于 f[i] 表示的是每段的最大值之和,可知 f[i] 这个序列单调不减,同时,对于一段区间的最大值而言,可以有很多转移的方式,既然 f[i] 序列单调不减,则可以将决策直接定在能够符合条件的 j 的最小值即可。通过这样,将枚举 j 寻找决策点的情况转化成了对于每个区间最大值对应的区间的最前端进行决策。而每个区间最大值可以采用单调队列进行维护即可,而取哪个点进行转移的最终决策还是要通过比较大小才能够知道,在这里可以用平衡树进行维护。

(QAQ看了好长时间才理解

代码如下

#include <cstdio>
#include <set>
using namespace std;
const int maxn=1e5+10; int n,a[maxn],q[maxn];
long long m,sum[maxn],f[maxn];
multiset<long long> s; int main(){
scanf("%d%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]>m){puts("-1");return 0;}
sum[i]=sum[i-1]+a[i];
}
int l=1,r=0,j=0;
for(int i=1;i<=n;i++){
while(sum[i]-sum[j]>m)++j;
while(l<=r&&q[l]<=j){
if(l<r)s.erase(a[q[l+1]]+f[q[l]]);
++l;
}
while(l<=r&&a[q[r]]<=a[i]){
if(l<r)s.erase(a[q[r]]+f[q[r-1]]);
--r;
}
q[++r]=i;
if(l<r)s.insert(a[i]+f[q[r-1]]);
f[i]=f[j]+a[q[l]];
if(l<r)f[i]=min(f[i],*s.begin());
}
printf("%lld\n",f[n]);
return 0;
}

【POJ3017】Cut the Sequence的更多相关文章

  1. 【poj3017】 Cut the Sequence

    http://poj.org/problem?id=3017 (题目链接) 题意 给出一个数列要求将它分割成许多块,每块的数的和不超过m,要求每块中最大的数之和最小. Solution 这道题真的很不 ...

  2. 【题解】Cut the Sequence(贪心区间覆盖)

    [题解]Cut the Sequence(贪心区间覆盖) POJ - 3017 题意: 给定一大堆线段,问用这些线段覆盖一个连续区间1-x的最小使用线段的数量. 题解 考虑一个这样的贪心: 先按照左端 ...

  3. 【CF486E】LIS of Sequence题解

    [CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...

  4. 【BZOJ4355】Play with sequence 线段树

    [BZOJ4355]Play with sequence Description 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a ...

  5. 【规律】A Rational Sequence

    题目描述 An infinite full binary tree labeled by positive rational numbers is defi ned by:• The label of ...

  6. 【最长下降子序列】【动态规划】【二分】XMU 1041 Sequence

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1041 题目大意: 一个二维平面,上面n(n<=1 000 000)个点.问至少选 ...

  7. 【动态规划】XMU 1583 Sequence

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1583 题目大意: T组数据,对于n(n<=6000)给定序列Xn(Xn<= ...

  8. 【SPOJ】2319 BIGSEQ - Sequence

    [算法]数位DP [题解]动态规划 题目要求的是大整数……没办法只写了小数字的,感觉应该没错. 大题框架是最大值最小化的二分问题. 对于每一块要求count(b)-count(a-1)≥s 已知a如何 ...

  9. 【leetcode】Longest Consecutive Sequence(hard)☆

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

随机推荐

  1. C#_图片存取数据库Winform

    #region 用于在PictureBox控件中显示选择的图片        /// <summary>        /// 用于在PictureBox控件中显示选择的图片        ...

  2. Python常见字符编码间的转换

    主要内容:     1.Unicode 和 UTF-8的爱恨纠葛     2.字符在硬盘上的存储     3.编码的转换     4.验证编码是否转换正确     5.Python bytes类型 前 ...

  3. vue element-ui 动态上传

    上传填写完毕的幼儿及体测数据文件,上传成功后会自动导入该文件的数据 <el-upload :action="UploadUrl()" :on-success="Up ...

  4. Beta版会议总结

    开会时间:2015年06月12日 开会地点:基教601 开会人员:李想,王颖瑞,朱少辉,陈晨,侯涛亮. 开会内容:对于6月10日,大一同学的投票情况进行讨论和反思. 讨论结果如下: 一.目前存在的问题 ...

  5. SqlDataAdapter简单介绍 (转)

    From:  http://blog.sobnb.com/u/92/5532.html 一.特点介绍 1.表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连 ...

  6. Beta阶段敏捷冲刺三

    一.举行站立式会议 1.当天站立式会议照片一张 2.团队成员报告 林楚虹 (1) 昨天已完成的工作:从数据库读取单词 (2) 今天计划完成的工作:在数据库单词表导入完整数据,完善select.js ( ...

  7. Disabling Chrome cache for website development

    https://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development https://s ...

  8. Selenium IDE 宏 试用 一例

    本质是宏(Macro)理念 Marco概念的广泛应用: 1.Office的Excel里的任何操作的 可以都可以用VBA编程记录下宏,然后把记录的宏,可以回放.当然也可以生成代码,比如给Excel设置单 ...

  9. C语言ODBC数据库操作

    今天我们来介绍一下C语言操作数据库的方法,这里我们使用的是ODBC方式.环境是WIN7+VC6.其他环境也差不多,具体情况具体分析. 首先是环境的配置以及数据源的添加.这里就不去解释了,相关资料网上有 ...

  10. Oracle备份恢复简单过程以及中间的坑.

    Oracle 冷备: 貌似需要dbca创建一致的oracle instance 服务器配置版本尽量相同,安装路径相同. 关闭Oracle服务 将oracle app 目录下的oradata以及有快速闪 ...