Link

题目大意:给定\(n\)个二元组,每次可以选择一组,花费是组内最大的长乘以最大的宽。问消掉所有二元组的最小代价。

\(\text{Solution:}\)

\(dp\)写的不够啊……

先挖掘一下题目性质,对于一个二元组,如果它的长和宽都可以被某一个二元组覆盖掉,则它显然是可以被并掉的,于是我们去掉。

这个是一遍\(sort\)就能解决的。

那么,我们把数组搞成一个长递减,宽递增的数列,设\(dp[i]\)表示前\(i\)个二元组全部消掉的最小价值。

可以证明,在这个情况下,我们买的土地都是连续的。因为如果不连续,则总有一块更大的可以把之前不连续的一段包进去,这显然是不优的。

于是,\(dp\)经典模型,\(dp[i]=\min_{j<i}dp[j]+x[j+1]*y[i].\)之所以这样写,是因为\(y\)是递增的,它可以覆盖到它前面所有;\(x\)递减,可以覆盖到后面的所有。

下面是最简单的推柿子。

\[dp[i]=dp[j]+x[j+1]*y[i]
\]
\[dp[j]=dp[i]-x[j+1]*y[i]
\]
\[dp[j]=-x[j+1]*y[i]+dp[i]
\]
\[y=dp[j],k=y[i],x=-x[j+1],b=dp[i]
\]

至此,\(y=kx+b\)初成。

于是,我们最小化截距就做完了。观察一下符号,显然地发现是下凸包。又有斜率\(y[i]\)是递增的,所以套路维护大于当前斜率的即可。

剩下的都是板子。这题主要学到了:认真观察题目性质,这种的可以一遍\(\text{sort}\)去掉,剩下的可以简单证明是连续的,从而化成一个\(dp\)的基本模型。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,tot,head,tail;
int q[200010],dp[200010];
struct node{
int x,y;
bool operator<(const node&B)const{
return x==B.x?y>B.y:x>B.x;
}
}a[200010];
int X(int x){return -a[x+1].x;}
int Y(int x){return dp[x];}
long double slope(int x,int y){return (Y(y)-Y(x))/(X(y)-X(x));}
//dp[i]=dp[j]+y[j+1]*x[i]
//dp[j]=-y[j+1]*x[i]+dp[i]
//y=dp[j],k=x[i],x=-y[j+1],b=dp[i] //dp[j]+a[j+1].y*x[i]>dp[k]+a[k+1].y*x[i]
// a[j+1].y*x[i]-a[k+1].y*x[i]>dp[k]-dp[j]
//x[i](a[j+1].y-a[k+1].y)>dp[k]-dp[j]
//x[i]>(dp[k]-dp[j])/(a[j+1].y-a[k+1].y)
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;++i)scanf("%lld%lld",&a[i].x,&a[i].y);
sort(a+1,a+n+1);
for(int i=1;i<=n;++i){if(a[i].y>a[tot].y)a[++tot]=a[i];}//x递减,y递增
//令y是斜率,则可以维护一个下凸包
//dp[i]=dp[j]+a[j+1].x*a[i].y
//注意此处x递减,y递增,斜率递增,可以On
//既然x递减,那么x限定的范围就是x到后面的i.x
//所以应该枚举的j.x来限定x而不是y
//因为y递增,所以它限定前面
//这题的收获有两个:
//一个是挖掘题目性质,去掉无用点
//而是注意到单调性,进而斜率优化
head=tail=1;q[head]=0;n=tot;
for(int i=1;i<=tot;++i){
while(head<tail&&slope(q[head],q[head+1])<=a[i].y)head++;
dp[i]=dp[q[head]]+a[q[head]+1].x*a[i].y;
while(head<tail&&slope(q[tail-1],q[tail])>=slope(q[tail-1],i))tail--;
q[++tail]=i;
}
printf("%lld\n",dp[n]);
return 0;
}

代码里面也有一些细节。

【题解】[USACO08MAR]Land Acquisition G的更多相关文章

  1. USACO08MAR Land Acquisition

    斜率优化 # include <stdio.h> # include <stdlib.h> # include <iostream> # include <s ...

  2. 洛谷 P2900 [USACO08MAR]土地征用Land Acquisition 解题报告

    P2900 [USACO08MAR]土地征用Land Acquisition 题目描述 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选 ...

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

    斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer Jo ...

  4. 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(动态规划,斜率优化,决策单调性,线性规划,单调队列)

    洛谷题目传送门 用两种不一样的思路立体地理解斜率优化,你值得拥有. 题意分析 既然所有的土地都要买,那么我们可以考虑到,如果一块土地的宽和高(其实是蒟蒻把长方形立在了平面上)都比另一块要小,那么肯定是 ...

  5. BZOJ1597 & 洛谷2900:[USACO2008 MAR]Land Acquisition 土地购买——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1597 https://www.luogu.org/problemnew/show/P2900 约翰准 ...

  6. 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(斜率优化)

    题意 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽.比如约翰并购一块3 ...

  7. P2900 [USACO08MAR]土地征用Land Acquisition

    \(\color{#0066ff}{ 题目描述 }\) 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些 ...

  8. luogu P2900 [USACO08MAR]土地征用Land Acquisition

    写这道题时,预处理部分少打了等号,吓得我以为斜率优化错了或者被卡精了 mmp 首先有一个很明显的结论(逃),就是一个土地如果长(\(x\))与宽(\(y\))都比另一个土地小,那么这个土地一定可以跟那 ...

  9. 【洛谷 P2900】 [USACO08MAR]土地征用Land Acquisition(斜率优化,单调栈)

    题目链接 双倍经验 设\(H\)表示长,\(W\)表示宽. 若\(H_i<H_j\)且\(W_i<W_j\),显然\(i\)对答案没有贡献. 于是把所有点按\(H\)排序,然后依次加入一个 ...

随机推荐

  1. 2020重新出发,NOSQL,什么是Redis?

    @ 目录 Redis是什么? NoSQL和传统数据库的区别 Redis的优点 Redis在Java Web中的应用 缓存 高速读/写场合 Redis是什么? Redis 是一个由 Salvatore ...

  2. SSD-Tensorflow 512x512 训练配置

    搞了几天终于把这个给搞得差不多了,遇到的错误这里也记录一下: 一.配置[配置什么的300和512其实差不多,这里只举一个例子来分析一下] 之前的文件修改什么的和300x300的一样:https://w ...

  3. [BUUOJ记录] [ACTF2020 新生赛]Include

    本题主要考查了利用php://filter伪协议进行文件包含 进入题目根据Tip进入正题,可以看到URL中存在文件包含(题目名也很直接) 首先考虑 "php://input"伪协议 ...

  4. 如何编写高质量的C#代码(一)

    从"整洁代码"谈起 一千个读者,就有一千个哈姆雷特,代码质量也同样如此. 想必每一个对于代码有追求的开发者,对于"高质量"这个词,或多或少都有自己的一丝理解.当 ...

  5. 项目中使用mybatis报错:对实体 "serverTimezone" 的引用必须以 ';' 分隔符结尾。

    报错信息如下: Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### ...

  6. fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached解决方法!

    UserAgent 就是用户代理,又叫报头,是一串字符串,相当于浏览器的身份证号,在利用爬虫爬取网站数据时,频繁更换它可以避免触发相应的反爬机制. fake-useragent对频繁更换UserAge ...

  7. 局域网内笔记本分屏到android手机上

    前提 笔记本电脑1台 安卓/ios手机1部 局域网 spacedesk 预览 参考: https://www.appinn.com/spacedesk https://spacedesk.net/de ...

  8. 漏洞扫描工具acunetix12会遇到的问题

    1.如果安装好之后,打开工具时显示无法访问,首先去看任务管理器当中,acunetix的服务是否启动了 2.如果忘记了账号密码,可以在安装目录下,双击ChangePassword.exe进行重置密码

  9. [LeetCode]287. 寻找重复数(二分)

    题目 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入: [ ...

  10. python蟒蛇绘制

    使用IDLE的文件方式编写代码并保存为PythonDraw.py文件 python蟒蛇绘制 import turtle引入了海龟绘图体系 使用setup函数,设定了一个宽650像素和高350像素的窗体 ...