Description

题意:给N个数,按顺序全部取走,每次取一段连续的区间,代价为\((S[i]-S[j])^2+M\)

其中M为一个给定的常数,\(S[i]\)为前缀和

\(N\leq 500000\)

Solution

常规的方程:\(dp[i]=min\{dp[j]+(S[i]-S[j])^2+M\}, j<i\)

\(O(n^2)\)是过不了50万的,用斜率优化

设有\(k<j<i\) 使得决策j更优,那么有

\(dp[j]+(S[i]-S[j])^2+M<dp[k]+(S[i]-S[k])^2+M\)

整理得 \(\frac{(dp[j]+S[j]^2)-(dp[k]+S[k]^2)}{(S[j]-S[k])}<2*S[i]\)

令\(f[i]=dp[i]+S[i]^2\),所以有\(\frac{f[j]-f[k]}{s[j]-s[k]}<2*S[i]\)

此时决策j更优,反之决策k优

易证\(f[i]\)也单调递增,所以可用单调队列维护

Code

#include <cstdio>
#include <algorithm>
#define N 500010
#define squ(x) ((x)*(x))
using namespace std; int n,M,l,r,q[N],s[N],dp[N]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} inline int f(int k,int j){return dp[j]+squ(s[j])-(dp[k]+squ(s[k]));}
inline int g(int k,int j){return s[j]-s[k];} void DP(){
l=1,r=0;q[++r]=0;dp[0]=0;
for(int i=1;i<=n;++i){
while(l<r&&f(q[l],q[l+1])<=2*s[i]*g(q[l],q[l+1])) l++;
int j=q[l];
dp[i]=dp[j]+squ(s[i]-s[j])+M;
while(l<r&&f(q[r],i)*g(q[r-1],q[r])<f(q[r-1],q[r])*g(q[r],i)) r--;//保证斜率单调
q[++r]=i;
}
} int main(){
while(~scanf("%d%d",&n,&M)){
for(int i=1;i<=n;++i) s[i]=s[i-1]+read();
DP();
printf("%d\n",dp[n]);
}
return 0;
}

[Hdu3507]Print Article(斜率优化)的更多相关文章

  1. HDU3507 Print Article —— 斜率优化DP

    题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others)    Mem ...

  2. hdu3507 Print Article[斜率优化dp入门题]

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  3. HDU3507 Print Article(斜率优化dp)

    前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...

  4. [hdu3507 Print Article]斜率优化dp入门

    题意:需要打印n个正整数,1个数要么单独打印要么和前面一个数一起打印,1次打印1组数的代价为这组数的和的平方加上常数M.求最小代价. 思路:如果令dp[i]为打印前i个数的最小代价,那么有 dp[i] ...

  5. HDU3507 Print Article (斜率优化DP基础复习)

    pid=3507">传送门 大意:打印一篇文章,连续打印一堆字的花费是这一堆的和的平方加上一个常数M. 首先我们写出状态转移方程 :f[i]=f[j]+(sum[i]−sum[j])2 ...

  6. hdu3507 Print Article(斜率DP优化)

    Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it ...

  7. HDU 3507 Print Article 斜率优化

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  8. hdu 3507 Print Article(斜率优化DP)

    题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的 ...

  9. Print Article /// 斜率优化DP oj26302

    题目大意: 经典题 数学分析 G(a,b)<sum[i]时 a优于b G(a,b)<G(b,c)<sum[i]时 b必不为最优 #include <bits/stdc++.h& ...

  10. hdu 3507 Print Article —— 斜率优化DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3507 设 f[i],则 f[i] = f[j] + (s[i]-s[j])*(s[i]-s[j]) + m ...

随机推荐

  1. mybatis使用说明

    起步:1.创建一个maven项目工程.2.打开pom.xml配置文件,3.设置源代码编码方式为UTF-8.4.设置编译源代码的JDK版本.最好大于1.6版本.5. 重点--添加Mybatis的相关依赖 ...

  2. 小程序的switch组件

    小程序的switch开关组件,总结下大概有三种使用场景. 其一: 纯展示场景, 用来展示某个开关值是打开还是关闭的,这个场景比较简单,给个disabled属性就ok了: 其二: 用户点击后立即切换开关 ...

  3. Day3上

    T1 星空[问题描述]你是能看到第一题的friends 呢.——hja点点星空是一张

  4. window.location获取url各项参数详解

    window.location方法后还还可以带href,search等参数,下面我们来看看获取url各项参数的办法. URL即:统一资源定位符 (Uniform Resource Locator, U ...

  5. 使用Fsharp 探索 Dotnet 平台

    Fsharp的交互开发环境使得我们在了解DotNet平台时能够快速的获得需要的反馈. 反馈在任何技艺的磨练过程中必不可少,我认为也是最重要的环节之一.在“一万小时天才理论”中,著名的髓鞘质就是在快速有 ...

  6. 框架使用-Sql拼接

     Sql语句拼写: 查询 DQueryDom DmoQuery(返回的整个对象) 更新 DQUpdateDom 删除 DQDeleteDom 条件 dom.Where.Conditions.Add(D ...

  7. hadoop集群搭建简要记录

    2019/03/09 21:46 准备4台服务器或者虚拟机[centos7],分别设置好静态ip[之所以设置静态ip主要就是为了省心!!!][ centos7下面配置静态IP  参考地址: https ...

  8. cf1051F. The Shortest Statement(最短路)

    题意 题目链接 题意:给出一张无向图,每次询问两点之间的最短路,满足$m - n <= 20$ $n, m, q \leqslant 10^5$ Sol 非常好的一道题. 首先建出一个dfs树. ...

  9. 对CSRF的理解及防范

    对CSRF的理解: 假定a是一个银行网站, b是一个危险网站. 当用户在访问a, 并且session并未结束的情况下, 去访问b网站, b网站就可以通过隐藏的url或者是表单来伪造用户对a的get或者 ...

  10. ECMAScript 原始值和引用值

    原始值和引用值 在ECMAScript中,变量可以存在两种类型的值,即原始值和引用值 原始值 存储