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;//输出答案
    }
    
  • 相关阅读:
    博客园样式
    nginx
    Django-environ 加载 .env 配置文件
    uwsgi 常见命令
    ActionScript3.0(AS3)中的泛型数组Vector
    ADDED、ADDED_TO_STAGE、REMOVED、REMOVED_FROM_STAGE这几个事件的区别
    Sprite/MovieClip的Enter_Frame事件,不受addChild/removeChild影响
    “AS3.0高级动画编程”学习:第二章转向行为(下)
    “AS3.0高级动画编程”学习:第二章转向行为(上)
    [转载]等角(斜45度)游戏与数学
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu2900.html
Copyright © 2011-2022 走看看