zoukankan      html  css  js  c++  java
  • 【洛谷2900】[USACO08MAR] Land Acquisition G(斜率优化DP)

    点此看题面

    • (n)(a_i imes b_i)的土地,并购一组土地的代价是(max{a_i} imesmax{b_i})
    • 求买到所有土地的最小代价。
    • (nle5 imes10^4)

    预处理

    直接(DP)是不太好搞的。

    考虑我们先给土地按(a_i)排个序。

    若一块土地(a_i,b_i)都比另一块土地小,那么我们完全可以让这块土地跟着那块土地一起买而不产生任何影响。

    因此,在(a_i)递增的情况下,(b_i)是递减的。

    此时并购肯定是并购一段区间(设其为([l,r])),代价就是(a_l imes b_r)

    斜率优化(DP)

    (f_i)为购买了前(i)块土地的代价,转移方程为:

    [f_i=min_{j=1}^{i-1}(f_j+a_i imes b_{j+1}) ]

    假设一个转移点(y)优于(x)(x<y)),说明:

    [f_x+a_{i} imes b_{x+1}ge f_y+a_i imes b_{y+1}\a_i imes(b_{x+1}-b_{y+1})ge f_{y}-f_x ]

    由于(x<y),故(b_{x+1}>b_{y+1}),可以直接两边同除:

    [a_igefrac{f_y-f_x}{b_{x+1}-b_{y+1}} ]

    (a_i)是递增的,因此我们直接维护一个单调递增的单调队列,每次从队首转移即可。

    代码:(O(nlogn))

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 50000
    #define LL long long
    using namespace std;
    int n,q[N+5];LL f[N+5];
    struct Data
    {
    	int x,y;I Data(CI a=0,CI b=0):x(a),y(b){}
    	I bool operator < (Con Data& o) Con {return x^o.x?x<o.x:y<o.y;}//按x排序
    }s[N+5];
    int main()
    {
    	RI i;for(scanf("%d",&n),i=1;i<=n;++i) scanf("%d%d",&s[i].x,&s[i].y);
    	RI t=0;for(sort(s+1,s+n+1),i=1;i<=n;++i) {W(t&&s[i].y>=s[t].y) --t;s[++t]=s[i];}//如果一块土地两维都小于另一块,直接忽略
    	RI H=1,T=1;for(q[1]=0,i=1;i<=t;q[++T]=i++)//斜率优化DP
    	{
    		W(H<T&&f[q[H+1]]-f[q[H]]<=1LL*s[i].x*(s[q[H]+1].y-s[q[H+1]+1].y)) ++H;//所有不再优的转移点直接弹掉
    		f[i]=f[q[H]]+1LL*s[i].x*s[q[H]+1].y;//转移
    		W(H<T&&(f[i]-f[q[T]])*(s[q[T-1]+1].y-s[q[T]+1].y)<(f[q[T]]-f[q[T-1]])*(s[q[T]+1].y-s[i+1].y)) --T;//维护单调递增
    	}return printf("%lld
    ",f[t]),0;//输出答案
    }
    
  • 相关阅读:
    1.BMap(百度地图)第二次加载显示不全
    SpringMVC的拦截器
    装饰者模式
    java产生随机数
    VS 常用快捷键
    给包含compid列且值为null ,表的行数据赋值--
    遍历数据库,删除包含指定列的表的行数据-
    DataTable select根据条件取值
    临时表汇总金额
    Redirect url 路径简单介绍
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu2900.html
Copyright © 2011-2022 走看看