zoukankan      html  css  js  c++  java
  • 洛谷 P2900 [USACO08MAR]土地征用Land Acquisition 解题报告

    P2900 [USACO08MAR]土地征用Land Acquisition

    题目描述

    约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地。如果约翰单买一块土 地,价格就是土地的面积。但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽。比如约翰并购一块3 × 5和一块5 × 3的土地,他只需要支付5 × 5 = 25元, 比单买合算。 约翰希望买下所有的土地。他发现,将这些土地分成不同的小组来并购可以节省经费。 给定每份土地的尺寸,请你帮助他计算购买所有土地所需的最小费用。

    输入输出格式

    输入格式:

    • Line 1: (A) single integer: (N)

    • Lines 2..(N+1): Line (i+1) describes plot (i) with two space-separated integers: (width_i) and (length_i)

    输出格式:

    • Line 1: The minimum amount necessary to buy all the plots.

    说明:
    (1<=N<= 50,000,1<= width_i <= 1,000,000,1<=length_i<=1,000,000)


    不裸的斜率优化。

    发现如果做动态规划,我们并没有一个明显的转移顺序。

    我们思考发现当一个矩形的长和宽都被可以被别的覆盖掉时,我们可以不考虑它。

    如果把横纵坐标分别设为长和宽,那么一个点可以覆盖掉它与原点构成的矩形中的点。

    这样的话,在坐标上剩下的点一定是横坐标递增,纵坐标递减的一个点集。

    对于这个点集,我们就可以按横坐标做DP了,因为如果覆盖大的区间,小的区间也一定会被覆盖。

    (dp[i])表示买下了前(i)块土地的最小花费。

    则转移为:(dp[i]=min_{0 le j < i} dp[j]+x[i]*y[j+1])

    套上斜率优化即可


    Code:

    #include <cstdio>
    #include <algorithm>
    #define ll long long
    using namespace std;
    const int N=50010;
    ll dp[N];
    int n,s[N],tot,q[N],l,r;
    pair <ll,ll> dx0[N],dx[N];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lld%lld",&dx0[i].first,&dx0[i].second);
        sort(dx0+1,dx0+1+n);
        for(int i=1;i<=n;i++)
        {
            while(tot&&dx0[s[tot]].second<=dx0[i].second) tot--;
            s[++tot]=i;
        }
        for(int i=1;i<=tot;i++)
            dx[i]=dx0[s[i]];
        l=r=1;
        for(int i=1;i<=tot;i++)
        {
            while(l<r&&(-dx[i].first)*(dx[q[l+1]+1].second-dx[q[l]+1].second)>=dp[q[l+1]]-dp[q[l]]) l++;
            dp[i]=dp[q[l]]+dx[i].first*dx[q[l]+1].second;
            while(l<r&&(dp[i]-dp[q[r]])*(dx[q[r]+1].second-dx[q[r-1]+1].second)
                  >=(dp[q[r]]-dp[q[r-1]])*(dx[i+1].second-dx[q[r]+1].second)) r--;
            q[++r]=i;
        }
        printf("%lld
    ",dp[tot]);
        return 0;
    }
    
    

    2018.7.21

  • 相关阅读:
    初赛—算法复杂度
    2-SAT
    最小生成树
    18-短信验证码接口
    17-腾讯云短信开发
    16-手机号是否存在验证接口
    15-多方式登录
    14-登录注册页面
    13-Git
    12-跨域请求详解
  • 原文地址:https://www.cnblogs.com/butterflydew/p/9348290.html
Copyright © 2011-2022 走看看