斜率优化DP

土地租用(加强版)

时间限制: 1 Sec  内存限制: 128 MB
提交: 233  解决:
72
[提交][状态][讨论版]

题目描述

随着YYHS的OI集训队人数急剧增加,原有的小机房已经容纳不了数量庞大的队员。 
于是史老师决定租用一些实验室机位供队员们训练,他正在考虑为N
(1 <= N <= 50,000)位队员租用机位。实验室管理员根据要求给出了N个机位的长和宽,每个机位的长宽满足(1 <= 宽 <=
1,000,000; 1 <= 长 <= 1,000,000). 
而机位的租用价格是它的面积,实验室管理员也提出,可以同时租用多个机位.
租用这一组机位的价格是它们最大的长乘以它们最大的宽, 但是机位的长宽不能交换.
如果想租下一个3x5的机位和一个5x3的机位,则他需要付5x5=25. 
于是问题出现了,史老师希望租下所有的机位,但是他发现分组来租这些机位可以节省经费.
他需要你帮助他找到最小的经费.

输入

*
第1行: 一个数: N

*
第2..N+1行: 每行包含两个数,分别为机位的长和宽

输出

*
第一行: 最小的可行费用.

样例输入

4
100 1
15 15
20 5
1 100

样例输出

500

提示

分3组租用这些机位: 第一组:100x1, 第二组1x100, 第三组20x5 和 15x15. 每组的价格分别为100,100,300, 总共500.

见代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
#define maxn 50005
long long f[maxn];
struct note{
    ll x,y;
    friend bool operator <(note a,note b)
    {
        return(a.x==b.x&&a.y<b.y||a.x<b.x);
    }
}a[maxn],b[maxn];
ll n,cnt,Q[maxn];
/*f[i]=min(f[j]+b[j+1].y*b[i].x)
f[j]+b[j+1].y*b[i].x<f[k]+b[k+1].y*b[i].x
f[j]-f[k]/(b[k+1].y-b[j+1].y)>b[i].x -->j is better than k
because of b[i].x is getting larger
g(i,j)>b[i].x mean i is better than j
g(i,j)>g(j,k) :when g(i,j)>b[i].x i is better than j;else k is better than j ;so it‘s fobitted
*/
double Slope(ll j,ll k)
{
    return (double)(f[j]-f[k])/(b[k+1].y-b[j+1].y);
 }
int main()
{
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++)
    {
        scanf("%lld %lld",&a[i].x,&a[i].y);
    }
    sort(a+1,a+1+n);
    for(ll i=1;i<=n;i++)
    {
        while(cnt&&a[i].y>=b[cnt].y) cnt--;
        b[++cnt]=a[i];
    }
    ll head,tail;
    head=tail=1;
    Q[1]=0;
    for(ll i=1;i<=cnt;i++)
    {
        while(head<tail&&Slope(Q[head],Q[head+1])<=b[i].x) head++;
        ll front=Q[head];
        f[i]=f[front]+b[i].x*b[front+1].y;
        while(head<tail&&Slope(Q[tail-1],Q[tail])>=Slope(Q[tail],i))tail--;
        Q[++tail]=i;
    }
    cout<<f[cnt]<<endl;
}
时间: 2024-10-12 08:56:56

斜率优化DP的相关文章

bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小. 帮助Pine求出最小方差是多少. 设方差是v,可以证明,v×m^2是一个整数.为了避免精度误差,输出结果时输出v×m^2. In

[bzoj 1911][Apio 2010]特别行动队(斜率优化DP)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1911 分析: 首先可以的到裸的方程f[i]=max{f[j]+a*(Si-Sj)^2+b*(Si-Sj)+c} 0<j<i 简化一下方程,我们知道对于一次项,最后结果肯定是b*Sn 所以可以写成f[i]=max{f[j]+a*(Si-Sj)^2+c} 0<j<i 我们不妨设0<x<y<i,且x比y优 即f[x]+a*(Si-Sx)^2+c>f[y]+a*

hdu 2993 MAX Average Problem (斜率优化dp入门)

MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5855    Accepted Submission(s): 1456 Problem Description Consider a simple sequence which only contains positive integers as

hdu3507之斜率优化DP入门

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 4780    Accepted Submission(s): 1437 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antiqu

bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏.由于地形的不同,在不同工厂建立仓库的费用可能是不同的.第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库的费用是Ci.对

HDU3045 Picnic Cows(斜率优化DP)

Picnic Cows Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2192    Accepted Submission(s): 675 Problem Description It’s summer vocation now. After tedious milking, cows are tired and wish to t

BZOJ 1096 [ZJOI2007]仓库建设 斜率优化dp

1096: [ZJOI2007]仓库建设 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1096 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚. 由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场

HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程很容易想出来,dp[i][j] 表示前 j 个数分成 i 组.但是复杂度是三次方的,肯定会超时,就要对其进行优化. 有两种方式,一种是斜率对其进行优化,是一个很简单的斜率优化 dp[i][j] = min{dp[i-1][k] - w[k] + sum[k]*sum[k] - sum[k]*sum[

BZOJ 3156: 防御准备 斜率优化DP

3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT 1<=N<=10^6,1<=Ai<=10^9 题解: 斜率优化DP: 首先将数组倒置 设定dp[i] 为前i的点的最优答案 易得 dp[i] = min{dp[j

【BZOJ-1096】仓库建设 斜率优化DP

1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3719  Solved: 1633[Submit][Status][Discuss] Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先