BZOJ 1597 土地购买

斜率优化。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 50050
#define inf 0x7f7f7f7f7f7f7f7fLL
using namespace std;
long long n,s[maxn],top=0,f[maxn],g[maxn],a[maxn],b[maxn],l,r,q[maxn];
struct pnt
{
    long long x,y;
}p[maxn];
bool cmp(pnt x,pnt y)
{
    if (x.x!=y.x) return x.x<y.x;
    return x.y<y.y;
}
double k(long long x,long long y)
{
    if (b[x]==b[y]) return inf;
    return (double)(g[x]-g[y])/(b[x]-b[y]);
}
int main()
{
    scanf("%lld",&n);
    for (long long i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].y);
    sort(p+1,p+n+1,cmp);
    for (long long i=1;i<=n;i++)
    {
        while ((p[i].y>=p[s[top]].y) && (top)) top--;
        s[++top]=i;
    }
    for (long long i=1;i<=top;i++) a[i]=p[s[i]].x,b[i]=p[s[i]].y;
    f[1]=a[1]*b[1];l=r=1;q[l]=1;
    for (long long i=2;i<=top;i++)
    {
        g[i]=f[i-1];
        while ((r-l>0) && (k(q[r-1],q[r])<k(q[r],i))) r--;
        q[++r]=i;
        while ((r-l>0) && (k(q[l],q[l+1])>=-a[i])) l++;
        f[i]=g[q[l]]+a[i]*b[q[l]];
    }
    printf("%lld\n",f[top]);
    return 0;
}
时间: 2024-11-02 14:29:54

BZOJ 1597 土地购买的相关文章

BZOJ 1597 土地购买 斜率优化

首先,我们看啊,这道题是把线性序列分段的问题,于是显然需要用DP (^o^)/YES! 于是,f[i]就代表购买前i块土地所需要的最小费用 那么我们就来思考方程,但是发现可能需要我们先来排一排序,搞一搞就出来方程了 于是我们把length升序排列,放到一个队列中 这时我们发现有这样一种现象 存在land[i].length>=land[j].length&&land[i].width>=land[j].width那么j完全没有存在的必要(j表示我好伤心~~(>_<)

bzoj 1957 土地购买

这道题是我斜率优化第一题,对此做一个纪念. 首先进行一遍筛选,然后动态规划表达式很快就写出来了f(i)=min(f(i)+b[j+1]*a[i]) 然后就要进行斜率优化了,显然这里边所有东西都是单调的,所以只需要维护单调队列即可. cal函数计算的是斜率,具体看代码吧(参考别人),以后要多加练习. 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5

bzoj 1597: [Usaco2008 Mar]土地购买 2011-12-27

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 697  Solved: 244[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价

BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4989  Solved: 1847[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地

BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i转移比由j转移优(i>j), 那么 dp(i)+xv*yi+1 < dp(j)+xv*yj+1 化简得 (dp(i) - dp(j))/(yi+1-yj+1) > -xv 然后就斜率优化, 单调队列维护一个下凸函数 --------------------------------------

斜率优化专题1——bzoj 1597 [Usaco2008 Mar] 土地购买 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24387147 [原题] 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1396  Solved: 480 [Submit][Status] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽

【BZOJ】【1597】【USACO 2008 Mar】土地购买

DP/斜率优化 Orz Hzwer…… 想到排序了,但没想到其实可以将序列转化为x递增且y递减的序列……因为x是递增的,若y[i]>y[i-1]那么第i-1个就足够小……以至于可以在搞定第 i 个的同时顺便带走…… 这次仔细写一下斜率优化的过程吧- 方程:$ f[i]=min\{ f[j]+x[i]*y[j+1] \} $ 若 $j>k$ 且 决策$j$更优,则有:\[ \begin{aligned} {f[j]+x[i]*y[j+1]} &<  {f[k]+x[i]*y[k+1

1597: [Usaco2008 Mar]土地购买

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4023  Solved: 1470[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地

1597: [Usaco2008 Mar]土地购买 [ dp+斜率优化 ] 未完

传送门 1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1979  Solved: 705[Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每