HDU 4258(Covered Walkway-斜率优化)
Covered Walkway
Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1273    Accepted Submission(s): 491
The building contractor has an interesting pricing scheme. To cover the walkway from a point atx to a point at
y, they will charge c+(x-y)2, wherec is a constant. Note that it is possible for
x=y. If so, then the contractor would simply chargec.
Given the points along the walkway and the constant c, what is the minimum cost to cover the walkway?
c (1≤c≤109), wheren is the number of points which must be covered, and
c is the contractor’s constant. Each of the followingn lines will contain a single integer, representing a point along the walkway that must be covered. The points will be in order, from smallest to largest. All of the points
will be in the range from 1 to 109, inclusive. The input will end with a line with two 0s.
yield answers which will fit in a signed 64-bit integer.
10 5000
1
23
45
67
101
124
560
789
990
1019
0 0
30726
pid=4257">4257
4260pid=4261">4261
4262设f[i]表示仅仅考虑前n个的最小费用
显然f[i]=f[j-1]+c+sqr(a[i]-a[j])
若选i比选j优(i<j)
f[i-1]+sqr(a[i]-a[y])+c<f[j-1]+sqr(a[j]-a[y])+c
f[i-1]+sqr(a[i])-f[j-1]-sqr(a[j])
----------------------------------- > 2*a[y]
a[i]-a[j]
斜率优化。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (1000000+10)
#define eps 1e-13
#define Read(x) { \
while (!isdigit(c=getchar())); \
x=c-48; \
while (isdigit(c=getchar())) x=x*10+c-48; \
}
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int n;
ll cost;
char c;
ll a[MAXN],f[MAXN];
struct P
{
int i;
long double x,y;
P(int _i,ll _x,ll _y):i(_i),x(_x),y(_y){}
P(ll _x,ll _y):x(_x),y(_y){}
P(){}
friend long double kk(P a,P b){if (abs(a.x-b.x)<eps) return (b.y-a.y)*INF;return (b.y-a.y)/(b.x-a.x); }
}st[MAXN];
struct V
{
long double x,y;
V(ll _x,ll _y):x(_x),y(_y){}
V(){}
V(P a,P b):x(b.x-a.x),y(b.y-a.y){}
friend long double operator*(V a,V b){return a.x*b.y-a.y*b.x; }
};
int main()
{
freopen("B.in","r",stdin); while (1)
{
scanf("%d%lld",&n,&cost);
if (!n) break;
For(i,n)
Read(a[i]) f[0]=0;
int head=1,tail=1;
st[1]=P(1,a[1],a[1]*a[1]);
Fork(i,1,n)
{
P A=P(i,a[i],f[i-1]+a[i]*a[i]);
while (head^tail&&V(st[tail-1],st[tail])*V(st[tail],A)<=0) tail--;
st[++tail]=A; while (head^tail&&kk(st[head],st[head+1])<2*a[i]) head++;
int k=st[head].i;
f[i]=f[k-1]+cost+(a[k]-a[i])*(a[k]-a[i]);
}
cout<<f[n]<<endl; }
return 0;
}
HDU 4258(Covered Walkway-斜率优化)的更多相关文章
- HDU 4258 Covered Walkway  斜率优化DP
		Covered Walkway Problem Description Your university wants to build a new walkway, and they want at ... 
- hdu 4258 Covered Walkway
		题目大意: 一个N个点的序列,要将他们全部覆盖,求总最少费用:费用计算: c+(x-y)2 分析: 斜率优化DP 我们假设k<j<i.如果在j的时候决策要比在k的时候决策好,那么也是就是d ... 
- HDU 3507 单调队列 斜率优化
		斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ... 
- hdu 3507 Print Article(斜率优化DP)
		题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的 ... 
- HDU 2829 Lawrence(斜率优化DP O(n^2))
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829 题目大意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草 ... 
- HDU 3507 Print Article 斜率优化
		Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ... 
- HDU 3480 Division(斜率优化+二维DP)
		Division Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 999999/400000 K (Java/Others) Tota ... 
- HDU.2829.Lawrence(DP 斜率优化)
		题目链接 \(Description\) 给定一个\(n\)个数的序列,最多将序列分为\(m+1\)段,每段的价值是这段中所有数两两相乘的和.求最小总价值. \(Solution\) 写到这突然懒得写 ... 
- HDU 2829 [Lawrence] DP斜率优化
		解题思路 首先肯定是考虑如何快速求出一段铁路的价值. \[ \sum_{i=1}^k \sum_{j=1, j\neq i}^kA[i]A[j]=(\sum_{i=1}^kA[i])^2-\sum_{ ... 
随机推荐
- hihocode 编程练习赛17
			1. f1 score 首先了解f1 score的计算方法, 我记得是学信息检索知道的, 然后简单处理就行. 由于我写的比较麻烦, 中间处理过程引入了一些除数为0的情况,导致错了很多次.其实是很简单的 ... 
- Android 蓝牙开发基本流程
			此例子基于 android demo 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少 Android对于蓝牙开发从2.0版本的sdk才开始支持,而 ... 
- 编译安装php、nginx
			以centos6.6为例 1.安装以及配置php 首先在官网下载源码包http://php.net/downloads.php 这里下载php-7.1.16 .tar.gzcd php-7.1.16 ... 
- drupal 8——在CKEditor中导入video media时添加caption会导致video缩小至消失
			在CKEditor中,我点击media browser,选择video型的media,并在caption中输入video的名字.当我保存后发现在前台页面的video消失了,只留下video的名字,点击 ... 
- Intent的调用
			//Intent intent=new Intent();//intent.setClass(MainActivity.this, GPSService.class);//以上二条可以合并成如下一条 ... 
- 实现PC延迟执行函数
			头文件内容: #pragma once typedef function<void ()> DelayClickHandler; typedef void (*pDelayFun)(); ... 
- Spring的核心机制依赖注入
			原文地址:http://developer.51cto.com/art/200610/33311.htm 本文主要讲解依赖注入(设值注入.构造注入),作用是可以使Spring将各层的对象以松耦合的方式 ... 
- N的阶乘末尾有多少个零?
			在创联ifLab的招新问答卷上看到这么一题 核心问题是: 求N!(N的阶乘)的末尾有多少个零? 由于在N特别大的时候强行算出N!是不可能的,所以肯定要另找方法解决了. 首先,为什么末尾会有0?因为2* ... 
- 【原】Python学习_Django搭建环境及创建第一个项目
			1.Window 平台安装 Python 下载安装包 https://www.python.org/downloads/windows/ 2.Pyhton环境变量配置 右键点击"计算机 ... 
- Python 递归、匿名函数、map和filter  day4
			一.递归---函数自己调用自己 1.一个错误递归的例子: count=0 def hello(): global count count+=1 print("count %s"%c ... 
