Print Article

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 4810    Accepted Submission(s): 1451

Problem Description
Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and it will certainly wear and tear, so Zero use a cost to evaluate this degree.
One day Zero want to print an article which has N words, and each word i has a cost Ci to be printed. Also, Zero know that print k words in one line will cost

M is a const number.
Now Zero want to know the minimum cost in order to arrange the article perfectly.
 
Input
There are many test cases. For each test case, There are two numbers N and M in the first line (0 ≤ n ≤ 500000, 0 ≤ M ≤ 1000). Then, there are N numbers in the next 2 to N + 1 lines. Input are terminated by EOF.
 
Output
A single number, meaning the mininum cost to print the article.
 
Sample Input
5 5 5 9 5 7 5
 
Sample Output
230
 
 
第一次写斜率优化,代码很丑。
斜率优化模式为dp[i]=min(a[j]*b[i]+c[j])+d[i]
则 dp[i]=a[j]*b[i]+c[j]+d[i]
  b[i]*a[j]+d[i]-dp[i]=c[j]
等价于 a*x  +    b       =y
而(x,y)已处理,可用log(n) 求出b的最值
与模板是式子本题f[i]=min(f[j]-2*sum[j]*sum[i]+sum[j]^2)+sum[i]^2+m相符。
另外,表示凸包写的还是很不熟练。
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define MAXN 510000
#define INF 0x3f3f3f3f
//AC
int n,m;
int num[MAXN];
typedef long long qword;
qword f[MAXN];
qword sum[MAXN];
inline qword sqr(int x)
{
return x*x;
}
//f[i]=min(f[j]-2*sum[j]*sum[i]+sum[j]^2)+sum[i]^2+m
//f[i]=-2*sum[j]*sum[i] + f[j]+sum[j]^2 +sum[i]^2 + m
// -2*sum[i]*sum[j] + sum[i]^2-f[i]+m == -f[j]-sum[j]^2
struct Point
{
qword x,y;
void init(qword xx,qword yy)
{
x=xx;y=yy;
}
};
Point make_point (qword x,qword y)
{
Point ret;
ret.init(x,y);
return ret;
}
qword xmul(Point p1,Point p2,Point p3)
{
return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);
}
double get_k(Point p1,Point p2)
{
if (p1.x==p2.x)throw "error";
return (double)(p2.y-p1.y)/(p2.x-p1.x);
}
struct Convex_Hall
{
Point pl[MAXN];
double kk[MAXN];
int topl;
void clear()
{
topl=-;
} Convex_Hall()
{
topl=-;
}
void add_point(Point pp)
{
if (topl<)
{
pl[++topl]=pp;
if (topl==&&pl[topl].x==pl[topl-].x)
{
if (pl[topl].y<pl[topl-].y)
{
topl--;
return ;
}else
{
pl[topl--]=pp;
return ;
} }
if (topl==)
{
kk[topl-]=get_k(pl[topl-],pl[topl]);
}
return ;
}
while (topl>=&&xmul(pl[topl-],pl[topl],pp)>=)
{
topl--;
}
pl[++topl]=pp;
kk[topl-]=get_k(pl[topl-],pp);
}
void pm()
{
int i;
for(i=;i<=topl;i++)
{
printf("(%d,%d) ",pl[i].x,pl[i].y);
}
printf("\n");
}
double get_maxb(double k)
{
int l,r,mid;
if (topl==-)throw "Error";
if (topl==)return pl[].y-pl[].x*k;
if (k>kk[])return pl[].y-pl[].x*k;
if (k<kk[topl-])return pl[topl].y-pl[topl].x*k;
l=,r=topl;
while (l<r)
{
mid=(l+r)>>;
if (kk[mid-]>=k&&kk[mid]<=k)
{
return pl[mid].y-pl[mid].x*k;
}
if (kk[mid-]<k)
{
r=mid;
}else
{
l=mid;
}
}
}
}H; int main()
{
//freopen("input.txt","r",stdin);
int i;
while (~scanf("%d%d",&n,&m))
{
H.clear();
for (i=;i<=n;i++)
{
scanf("%d",&num[i]);
sum[i]=sum[i-]+num[i];
}
memset(f,INF,sizeof(f));
/* f[0]=0;
for (i=1;i<=n;i++)
{
for (j=0;j<i;j++)
{
if (f[j]>=INF)continue;
f[i]=min(f[i],f[j]+sqr(sum[i]-sum[j])+m);
}
}
for (i=1;i<=n;i++)cout<<f[i]<<" ";cout<<endl;
*/ f[]=;
H.add_point(make_point(sum[],-sum[]*sum[]-f[]));
double k,b;
for (i=;i<=n;i++)
{
k=-*sum[i];
b=H.get_maxb(k);
f[i]=sum[i]*sum[i]+m-ceil(b);
H.add_point(make_point(sum[i],-sum[i]*sum[i]-f[i]));
// cout<<f[i]<<" ";
}
cout<<f[n]<<endl;;
}
return ;
}

HDU 3507 Print Article 斜率优化的更多相关文章

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

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

  2. 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 ...

  3. HDU 3507 - Print Article - [斜率DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 Zero has an old printer that doesn't work well s ...

  4. HDU 3507 单调队列 斜率优化

    斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...

  5. ●HDU 3507 Print Article

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解: 斜率优化DP 一个入门题,就不给题解了,网上的好讲解很多的.   这里就只提一个小问题吧( ...

  6. HDU 3507 Print Article(DP+斜率优化)

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

  7. DP(斜率优化):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)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  9. HDU 3507 Print Article(斜率优化)

    显然的斜率优化模型 但是单调队列维护斜率单调性的时候出现了莫名的锅orz 代码 #include <cstdio> #include <algorithm> #include ...

随机推荐

  1. Activiti5.16.4数据库表结构

    一.ACTIVITI 数据库E-R图(5.16.4) Activiti 5.16.4 总共有24张表,增加act_evt_log(事件日志),以及增加了对SasS的支持. 在流程定义.运行实例和历史的 ...

  2. mybatis04 根据用户名称模糊查询用户信息

    根据用户名称模糊查询用户信息可能返回多条记录. 1.1.1User.xml 编码 如果用%进行模糊查询,#{}表示一个占位符会被翻译为一个?号(SELECT * FROM USER WHERE id= ...

  3. myecipse的debug调试操作方法

    在myecipse如果想要查询某个变量的值,或者跟踪程序的执行流程,可以如下操作: 首先在程序中设置好断点(断点的设置方法,就是在想要设置的地方的行首双击,当一个蓝色的圆形实心图标显示出来,就证明你设 ...

  4. mongnodb 启动脚本

    开始用mongodb建立一套监控体系,安装解压即可.附上编写的mongodb启动管理脚本. 建议 mkdir sbin 目录,放到sbin目录下.废话少说,代码如下: #!/bin/bash MONG ...

  5. vi 使用笔记

    基本A 当前行追加J 去除本行和下一行之间的换行符(写CSS利器)~ 光标所在处的字符进行大小写互换* 向前搜索目前光标所在的单词# 向后搜索目前光标所在的单词% 查找与光标所在处相匹配的反括号, 包 ...

  6. Oracle学习----集群因子(Clustering Factor)

    1.集群因子的算法: 通过dbms_rowid.rowid_block_number(rowid)找到记录对应的block 号.索引中记录了rowid,因此oracle 就可以根据索引中的rowid来 ...

  7. RedHat7搭建PHP开发环境(Zend Studio)

    下载Zend Studio # wget http://downloads.zend.com/studio-eclipse/13.0.1/ZendStudio-13.0.1-linux.gtk.x86 ...

  8. 动态添加JS文件到页面

    /*** ** 功能: 加载外部JS文件,加载完成后执行回调函数callback ***/ var utools = { config: { id: "", url: " ...

  9. Developing iOS8 Apps with Swift——iOS8概览

    iOS 8 概览 斯坦福公开课--Developing iOS8 Apps with Swift学习笔记 想学习Swift,但是相应的教程不是很多,在CoCoaChina社区闲逛时恰好发现了这门课程, ...

  10. C#删除数组元素代码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...