Poj   AcWing

Description

给定一个长度为N的序列 A,要求把该序列分成若干段,在满足“每段中所有数的和”不超过M的前提下,让“每段中所有数的最大值”之和最小.

N<=105,M<=1011,0<Ai<=106

Sol

一篇比较清楚的题解 $OvO$

$F[i]$表示把前$i$个数分成若干段,满足每段中所有数之和不超过$M$的前提下,各段的最大值之和的最小值

不难推出转移方程:

但是直接枚举$j$的做法是$O(N^{2})$的,显然过不去,还要优化.

DP转移优化的指导思想是及时排除不可能的决策,保持候选集合的高度有效性和秩序性.

本着这个思想我们来思考怎样的j可能成为最优解.

$j$要满足一下两个条件之一才有可能成为最优解:

1.$A[j+1]=max\ Ak$

2.$\sum_{k=j}^{i}Ak>M$ 即: j是满足区间和小于等于$M$的最小下标

证明,反证法:

假设以上条件都不成立

由以上条件可知$[j,i]$和$[j-1,i]$的区间都是满足题意(区间和$<=M$)且区间最大值相等

又因为显然有$F[j-1]$≤$F[j]$

所以$F[j-1]+max{Ak}<F[j]+max{Ak}$

$j-1$比$j$更优,$j$不可能是最优的

第$1$个条件显然可以维护一个$j$递增,$Aj$递减的单调队列

第$2$个条件的$j$也显然是递增的,所以就维护一个$nw$表示对于当前i满足该条件的$j$,$i+1$时,检查$nw$是否还满足区间和$>M$,满足就$nw++$.至于$max\ Ak$,当然可以用$ST$表预处理出来,但是其实不用辣么麻烦,因为对于每一个$i$,我们都会算出满足条件$1$ 的 $j$,然后它就是最大值丫,就可以直接更新答案了.

Code

#include<iostream>
#include<cstdio>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i++)
#define ll long long
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int n,a[],q[],f[];
ll m,s[];
int main()
{
n=read(),scanf("%lld",&m);
go(i,,n){a[i]=read();s[i]=s[i-]+a[i];if(a[i]>m){printf("-1");return ;}}
int nw=,h=,t=;
go(i,,n)
{
while(s[i]-s[nw-]>m)nw++;
while(h<=t && q[h]<nw)h++;
while(h<=t && a[q[t]]<=a[i])t--;
q[++t]=i;
f[i]=f[nw-]+a[q[h]];
go(j,h,t-)f[i]=min(f[i],f[q[j]]+a[q[j+]]);
}
printf("%d\n",f[n]);
return ;
}

随机推荐

  1. oracle函数 INSTRB(C1,C2[,I[,J]])

    [功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按2个字符计算 [参数] C1    被搜索的字符串 C2    希望搜索的字符串 I     搜 ...

  2. oracle函数 INITCAP(c1)

    [功能]返回字符串并将字符串的第一个字母变为大写,其它字母小写; [参数]c1字符型表达式 [返回]字符型 [示例] SQL> select initcap('smith abc aBC') u ...

  3. 亿级消息系统的核心存储:Tablestore发布Timeline 2.0模型

    背景 互联网快速发展的今天,社交类应用.消息类功能大行其道,占据了大量网络流量.大至钉钉.微信.微博.知乎,小至各类App的推送通知,消息类功能几乎成为所有应用的标配.根据场景特点,我们可以将消息类场 ...

  4. CSS常用函数calc等

    >>CSS常用函数<<

  5. Project Euler Problem 23-Non-abundant sums

    直接暴力搞就行,优化的地方应该还是计算因子和那里,优化方法在这里:http://www.cnblogs.com/guoyongheng/p/7780345.html 这题真坑,能被写成两个相同盈数之和 ...

  6. HDU1711 Number Sequence 题解 KMP算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 题目大意:最基础的字符串匹配,只不过这里用整数数组代替了字符串. 给你两个数组 \(a[1..N ...

  7. HTML静态网页--框架

    框架: 1.frameset frameset最外层的去掉body,直接用frameset 在超级链接指定目标页面显示在哪个框架窗口中 第一步:给要显示内容的目标frame设置name属性 第二步:给 ...

  8. Codeforces Round #172 (Div. 1 + Div. 2)

    A. Word Capitalization 模拟. B. Nearest Fraction 枚举. C. Rectangle Puzzle 求出两个矩形的点,套简单多边形的面积交板子. D. Max ...

  9. H3C PAP验证配置示例

  10. iptables单个规则实例

    iptables -F? # -F 是清除的意思,作用就是把 FILTRE TABLE 的所有链的规则都清空 iptables -A INPUT -s 172.20.20.1/32 -m state ...