#斜率优化#JZOJ 2204 洛谷 2900 BZOJ 1597 土地购买

news/2024/12/27 3:47:59/

题目


分析

首先把宽度 l l l按第一关键字从小到大排序,高度 h h h按第二关键字从大到小排序,用一个栈把存在 h [ x ] ≤ h [ y ] , l [ x ] ≤ l [ y ] h[x]\leq h[y],l[x]\leq l[y] h[x]h[y],l[x]l[y]的情况消掉,然后一个显然的性质可以发现最优情况肯定是选择连续的一段,那么可以这样列出dp方程
d p [ i ] = min ⁡ { d p [ j ] + h [ j + 1 ] ∗ l [ i ] } dp[i]=\min\{dp[j]+h[j+1]*l[i]\} dp[i]=min{dp[j]+h[j+1]l[i]}
k ( j &lt; k ) k(j&lt;k) k(j<k)优于 j j j,那么 d p [ j ] + h [ j + 1 ] ∗ l [ i ] ≥ d p [ k ] + h [ k + 1 ] ∗ l [ i ] dp[j]+h[j+1]*l[i]\geq dp[k]+h[k+1]*l[i] dp[j]+h[j+1]l[i]dp[k]+h[k+1]l[i]
那么化简可得 d p [ j ] − d p [ k ] ≥ ( h [ k + 1 ] − h [ j + 1 ] ) ∗ l [ i ] dp[j]-dp[k]\geq (h[k+1]-h[j+1])*l[i] dp[j]dp[k](h[k+1]h[j+1])l[i]
因为若 h [ k + 1 ] ≥ h [ j + 1 ] h[k+1]\geq h[j+1] h[k+1]h[j+1],那么 l [ k + 1 ] &gt; l [ j + 1 ] l[k+1]&gt;l[j+1] l[k+1]>l[j+1]也不符合消掉的情况,所以 h [ k + 1 ] &lt; h [ j + 1 ] h[k+1]&lt;h[j+1] h[k+1]<h[j+1]
d p [ j ] − d p [ k ] h [ k + 1 ] − h [ j + 1 ] ≤ l [ i ] \frac{dp[j]-dp[k]}{h[k+1]-h[j+1]}\leq l[i] h[k+1]h[j+1]dp[j]dp[k]l[i]
显然 l l l是单调递增的,所以维护下凸壳,单调队列优化,时间复杂度 O ( n ) O(n) O(n)


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
struct rec{int x,y;bool operator <(const rec &t)const{return x<t.x||(x==t.x&&y>t.y);}
}a[50001];
long long dp[50001]; int n,top,head,tail,q[50001];
inline signed iut(){rr int ans=0; rr char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
inline double slope(int j,int k){return 1.0*(dp[k]-dp[j])/(a[j+1].y-a[k+1].y);}
signed main(){n=iut();for (rr int i=1;i<=n;++i) a[i]=(rec){iut(),iut()};sort(a+1,a+1+n);for (rr int i=1;i<=n;++i){while (top&&a[top].y<=a[i].y) --top;a[++top]=a[i];}n=top,head=1,tail=0,q[++tail]=0;for (rr int i=1;i<=n;++i){while (head<tail&&slope(q[head],q[head+1])<=a[i].x) ++head;dp[i]=dp[q[head]]+1ll*a[i].x*a[q[head]+1].y;while (head<tail&&slope(q[tail-1],q[tail])>=slope(q[tail],i)) --tail;q[++tail]=i;}return !printf("%lld",dp[n]);
} 

http://www.ppmy.cn/news/203951.html

相关文章

JavaScript实例(Visual Studio Code)(一)

JavaScript程序本身不能独立存在 它是依附于某个HTML页面 在浏览器端运行的 基本语法&#xff1a; <script type"text/javascript" [src"外部js文件"]>... </script> 语法说明&#xff1a; script为脚本标记&#xff0c;它必须以<scri…

BZOJ2900 好玩的数字游戏

好玩的数字游戏 TK在虐题的同时&#xff0c;也喜欢玩游戏。现在&#xff0c;有这样的一个游戏&#xff0c;规则是这样的&#xff1a;先随机给出一个数字N&#xff0c;然后你在操场上把1到N的所有数字写成一排&#xff0c;就像这样&#xff1a;123456789101112131415….接着你在…

web day16(log4j日志框架、事务)

1.log4j概述 log4j log for java专门为Java提供的日志框架 是目前公司中Java语言收集日志的主流日志框架 a.特点&#xff1a; 收集的优先级 收集数据的目的地 文件 console 收集数据的展示形式 HTML pattern 2.如何使用log4j a.在程序中导入log4j 的jar包 b.书写配置文件 log4j…

P2900 [USACO08MAR]土地购买Land Acquisition G

文章目录 R e s u l t Result Result H y p e r l i n k Hyperlink Hyperlink D e s c r i p t i o n Description Description S o l u t i o n Solution Solution C o d e Code Code R e s u l t Result Result H y p e r l i n k Hyperlink Hyperlink https://www.luogu.co…

ccpd文件名转成xml_Fedora 16 64bit 下安装 LBP2900打印机

Fedora 16 64bit下安装 LBP2900打印机 Hello. Im goingo to post the new guide for the installation of Canon LBP2900 series on Fedora 17. I think that this guide may be useful for all Canon LBP series. 1)open root terminal and dont connect the printer 2) insta…

电脑加内存遇到的不开机问题解决

电脑系统是win7 电脑是联想台式机 简单配置如下 自己找了个神州电脑的4G内存条想加上升级一下&#xff0c;当天直接关机然后没有断电源&#xff0c;直接把内存条搞上去&#xff0c;然后重启&#xff0c;系统没问题显示是8G内存。 结果第二天来了就坑爹了&#xff0c;发现系…

oracle_j000,DBA手记:System State转储之ROW CACHE对象

DBA手记:System State转储之ROW CACHE对象 在《Oracle DBA手记 3》即将出版之际&#xff0c;我将《Oracle DBA手记 2》上收录的一些文章发布出来&#xff0c;与大家分享。前文参考&#xff1a; http://www.eygle.com/archives/2011/05/dbasystem_state_file.html 1.1ROW CACHE对…

bzoj2900

2900: 好玩的数字游戏 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 7 Solved: 4 [ Submit][ Status][ Discuss] Description TK在虐题的同时&#xff0c;也喜欢玩游戏。 现在&#xff0c;有这样的一个游戏&#xff0c;规则是这样的&#xff1a; 先随机给出一个数字N&am…