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. 系统的启动模式(启动级别)的改动---使用upstart启动机制的

    /*********************************************************************  * Author  : Samson  * Date   ...

  2. TCP参数设置

    我们这里应用的是CentOS5.3,并内核使用的是2.6.18-128.el5PAE #1 SMP .修改部分TCP ,有的是为了提高性能与负载,但是存在降低稳定性的风险.有的则是安全方面的配置,则有 ...

  3. Boost Build

    Window XP + Visual Studio 2008 获取Boost库源码 我们可以从http://www.boost.org/ 上获取boost的源代码.当前最新版本为1.45.0. 解压到 ...

  4. ubuntu首次给root用户设置密码

    用过ubuntu的人都知道,刚安装好root用户是没有密码的,没有密码我们就没法用root用户登录 给root用户设置密码输入命令sudo passwd,然后系统会让你输入密码,这时输入的密码就是ro ...

  5. 30、ADO.NET、事务、DataSet

    ADO.NET ADO.NET是一组用于和数据源进行交互的面向对象类库.通常数据源是数据库,但也可以是文本文件.Excel表格.XML文件. 说白了就是使用.net操作数据库的一套类库. ADO.NE ...

  6. VB------VS2012 IDE

    当编辑器的前面出现很多小点不影响 运行的时候 Ctrl+E+S就可以取消

  7. 利用反射把查询到的Table、Reader转换成List、Model

    菜鸟一枚,入园已有两年三个月,这还是第一次写博客,请各位大神斧正. 这是我写的一个工具类,通常我们从数据库查询到一个  DataReader  或者是  一个 Table , 想要转换成 一个 lis ...

  8. 将P2P虚拟货币(比特币、莱特币....)的算力用于公共的分布式计算的猜想

    比特币最近几年非常火爆.发明者中本聪设计了一个特定的算法用于生成(发行)比特币,让各位玩家(矿工)用自己的CPU.显卡,或者更加专业的矿机,通过无聊的并行计算算出比特币的特定密码(挖矿).为了保证全网 ...

  9. C++ 静态、动态链接库的简单实现

    一.什么是静态链接库,什么是动态链接库? 1.静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些.在静态库情况下,函数和数据被编译进 ...

  10. Apache提示You don't have permission to access / on this server问题解决

    测试时遇到将一本地目录设置为一apache的虚拟主机,在httpd-vhosts.conf文件中进行简单设置,然后在hosts文件中将访问地址指向本地,启动apache,进行访问,却出现了You do ...