bzoj1597/luogu2900 土地购买 (斜率优化dp)

首先按x从小到大排序,那么可得:

f[i]=min{f[j]+x[i]*maxy[j+1..i]}

然而这样是$O(n^2)$的而且无法做优化。

然后我们考虑:如果对于某一点,存在另一点的x和y都比它大,那这个点是可以删掉不参与计算的(因为那个较大的点一定要被买,那只要把这两点放在一组里,较小的点是绝对不会被算到的)

然后就可以发现,随着x[i]单调增,y[i]是单调减的

那刚才的式子就可以变成f[i]=min{f[j]+x[i]*y[j+1]}了,于是就可以做斜率优化了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define LL long long int
 5 using namespace std;
 6 const int maxn=50050;
 7
 8 int rd(){
 9     int x=0;char c=getchar();
10     while(c<‘0‘||c>‘9‘) c=getchar();
11     while(c>=‘0‘&&c<=‘9‘) x=x*10+c-‘0‘,c=getchar();
12     return x;
13 }
14
15 struct Node{
16     int x,y;
17 }p[maxn];
18 int N,q[maxn],h,t;
19 LL x[maxn],y[maxn],f[maxn];
20 bool deled[maxn];
21
22 inline bool cmp(Node a,Node b){
23     return a.x==b.x?a.y<b.y:a.x<b.x;
24 }
25
26 inline bool judge1(int j1,int j2,int i){
27     return f[j1]-f[j2]<x[i]*(y[j2+1]-y[j1+1]);
28 }
29 inline bool judge2(int j1,int j2,int j3){
30     return (f[j1]-f[j2])*(y[j2+1]-y[j3+1])>(f[j2]-f[j3])*(y[j1+1]-y[j2+1]);
31 }
32
33 int main(){
34     int i,j,k;
35     N=rd();
36     for(i=1;i<=N;i++) p[i].x=rd(),p[i].y=rd();
37     sort(p+1,p+N+1,cmp);
38     for(i=N;i;i=j){
39         for(j=i-1;j&&p[j].y<p[i].y;j--) deled[j]=1;
40     }for(i=1,j=0;i<=N;i++){
41         if(!deled[i]) x[++j]=p[i].x,y[j]=p[i].y;
42     }N=j;
43     q[h=t=1]=0;
44     for(i=1;i<=N;i++){
45         while(h<t&&!judge1(q[h],q[h+1],i)) h++;
46         f[i]=f[q[h]]+x[i]*y[q[h]+1];
47         while(h<t&&!judge2(q[t-1],q[t],i)) t--;
48         q[++t]=i;
49     }printf("%lld",f[N]);
50 }

原文地址:https://www.cnblogs.com/Ressed/p/9457403.html

时间: 2024-10-07 14:27:22

bzoj1597/luogu2900 土地购买 (斜率优化dp)的相关文章

【BZOJ1597】【Usaco2008 Mar】土地购买 斜率优化DP

题解:首先将块排个序,然后去掉被其它某块包含的块,然后斜率优化dp dp方程:f[i]=f[j]+a[i]*b[j+1]; 具体什么x啊y啊什么的在代码注释里面. --....纠结死了.开始各种WA,现在才发现: inline long long xmul(Point i,Point j,Point k){(i.y-j.y)*(j.x-k.x)-(j.y-k.y)*(i.x-j.x);} 上面的代码竟然能通过编译--,无力吐槽.以后一定要用终端+Wall命令编译文件了. warning一日不死,

bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x上.只要改一下slope里的一个负号,就变成正常舒服的递增了. 这道题的要点其实是一开始h=0.不能h=1.这样就能把dp[0]纳入考虑.这是需要的. #include<iostream> #include<cstdio> #include<cstring> #includ

BZOJ 1597 Usaco 2008 Mar 土地购买 斜率优化DP

题目大意:给出一些木板,现在要购买这些木板.购买的规则是可以一些木板一起买,然后价格是最大的长度乘最大的宽度.求购买所有木板的最小费用. 思路:如果一个木板的长也比一个木板小,宽也比一个木板小,那么这个木板就可以被排除.把所有木板按照x的长度排序,然后去掉排除的木板,然后剩下的木板就是x值下降, y值上升的木板.这样的话我们买下连续的一段的费用就是x[j] * y[i],然后DP方程就很简单了:f[i] = f[j] - x[j + 1] * y[i]. 注意到数据范围,写一个斜率优化就水过了.

BZOJ 1597 土地购买 斜率优化

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

BZOJ1597 [USACO2008]土地购买

Description 农 夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要付5x5=25. FJ希望买下所有的土地,但是他发现分组来买这

『土地征用 Land Acquisition 斜率优化DP』

斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer John is considering buying more land for the farm and has his eye on N (1 <= N <= 50,000) additional rectangular plots, each with integer dimensions (1

斜率优化DP总结

前言: 也是好久没有写题解了,最近主要学习了单调栈单调队列以及斜率优化DP这几个知识点,对于较难的斜率优化DP,做个小小的总结吧. 正(che)文(dan): T1 hdu 3507 在一个风和日丽的早上,你打开了网页,点进了hdu,偶然间看到了这道题,不屑的以为这仅仅是一个很水的DP,2分钟给出DP方程式,很快的写完后发现n的范围居然是500000,这让已经推出来的 O(n2)复杂度的递推式情何以堪,所以就产生了一种高逼格的优化方式:斜率优化. 这道题的方程式是什么呢? dp[i]=min(d

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*