\(\color{#0066ff}{ 题目描述 }\)

约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地。如果约翰单买一块土 地,价格就是土地的面积。但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽。比如约翰并购一块3 × 5和一块5 × 3的土地,他只需要支付5 × 5 = 25元, 比单买合算。 约翰希望买下所有的土地。他发现,将这些土地分成不同的小组来并购可以节省经费。 给定每份土地的尺寸,请你帮助他计算购买所有土地所需的最小费用。

\(\color{#0066ff}{输入格式}\)

Line 1: A single integer: N

Lines 2..N+1: Line i+1 describes plot i with two space-separated integers: \(width_i\) and \(length_i\)

\(\color{#0066ff}{输出格式}\)

Line 1: The minimum amount necessary to buy all the plots.

\(\color{#0066ff}{输入样例}\)

4
100 1
15 15
20 5
1 100

\(\color{#0066ff}{输出样例}\)

500

\(\color{#0066ff}{数据范围与提示}\)

none

\(\color{#0066ff}{题解}\)

首先可以发现,对于两个矩形, 如果一个可以完全包含另一个,完全可以让这两个一组,这样那个小的矩形就没贡献了,可以删掉

按长为第一关键字,宽为第二关键字从小到大排序

倒着扫一遍,维护max宽,如果当前矩形的宽小于max宽,又因为排序一定小于长

所以当前矩形就没用了,否则放入一个新的数组里

翻转一下可以发现

这个数组的矩形,长递增,宽递减

最优的分组一定是几个连续的区间

可以发现一个区间的价值是l的长和r的宽

如果不连续,那么价值要比这个大

所以就可以DP了

\(f[i] = f[j-1]+i_a*j_b\)

把\(i_a\)作为斜率移到左边,因为是负的,而且还要维护最小值,斜率应为正的

可以直接取正的维护最大值然最后取反就行了

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; int x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 50505;
using std::pair;
using std::make_pair;
pair<LL, LL> mp[maxn], a[maxn];
int cnt;
LL f[maxn];
LL X(int x) { return a[x + 1].second; }
LL Y(int x) { return f[x]; }
double K(int x, int y) { return (double)(Y(x) - Y(y)) / (double)(X(x) - X(y)); }
int main() {
int n = in();
for(int i = 1; i <= n; i++) mp[i].first = in(), mp[i].second = in();
std::sort(mp + 1, mp + n + 1);
LL max = 0;
for(int i = n; i >= 1; i--) {
if(mp[i].second > max) a[++cnt] = mp[i];
max = std::max(max, mp[i].second);
}
std::reverse(a + 1, a + cnt + 1);
static int q[maxn], head, tail;
for(int i = 1; i <= cnt; i++) {
LL k = a[i].first;
while(head < tail && k > K(q[head], q[head + 1])) head++;
f[i] = f[q[head]] - a[i].first * a[q[head] + 1].second;
while(head < tail && K(q[tail], q[tail - 1]) > K(i, q[tail - 1])) tail--;
q[++tail] = i;
}
printf("%lld\n", -f[cnt]);
return 0;
}

P2900 [USACO08MAR]土地征用Land Acquisition的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [LuoguP2900] [USACO08MAR]土地征用(Land Acquisition)

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

  7. [USACO08MAR]土地征用Land Acquisition

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

  8. Luogu 2900 [USACO08MAR]土地征用Land Acquisition

    斜率优化dp. 首先发现如果存在$x$和$y$使得$len(x) \geq len(y)$并且$wid(x) \geq wid(y)$,那么$y$直接不考虑就好了,因为在买$x$的时候就把$y$顺便带 ...

  9. 洛谷2900 [USACO08MAR]土地征用Land Acquisition (斜率优化+dp)

    自闭的一批....为什么斜率优化能这么自闭. 首先看到这个题的第一想法一定是按照一个维度进行排序. 那我们不妨直接按照\(h_i\)排序. 我们令\(dp[i]\)表示到了第\(i\)个矩形的答案是多 ...

随机推荐

  1. windows下python访问ipv6报错

    错误 Traceback (most recent call last): File , in <module> app.run() File , in run return wsgi.r ...

  2. xcode编译静态库选择cpu架构

    此前编译了一个静态库,默认支持了armv7,armv7s,arm64 编译的话肯定是上面三个静态库分别编译出来,然后在把这三个合并成一个单独的库. 如果单个库的大小是10M,那编译总的库大概就30M了 ...

  3. C#WinForm如何调整控件的Tab按键顺序

    在日常生活中,很多用户都会有使用Tab键的习惯.而在C#的WinForm开发中,Tab按键的顺序默认是你拖拽进窗体的顺序.那么我们如何修改这个顺序呢?答案如下(以VS2010为例). 只需要点击[视图 ...

  4. Hadoop运行程序不报错只有warn也没反应也不输出结果的解决办法

    log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFact ...

  5. c++ vector用法和迭代器

    1.在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. (1)头文件#include<vector>. (2)创建vector对象,vector<int> ...

  6. linux&nbsp;dev/dsp&nbsp;声卡学习笔记

    原文地址:dev/dsp 声卡学习笔记">linux dev/dsp 声卡学习笔记作者:ziyou飞翔       无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(f ...

  7. Tensorflow手写数字识别训练(梯度下降法)

    # coding: utf-8 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #p ...

  8. 设置 PyCharm 软件中 Terminal 窗口 中启动的 python 交互命令的版本

    设置 PyCharm 软件中 Terminal 窗口 中启动的 python 交互命令的版本 python2 和 python3 有很大的不同,使用python2 编写的程序,如果使用python3 ...

  9. DR客户端一直连接服务器....(6)

    DR客户端一直连接服务器....(非未选择网卡)解决方法: 控制面板-->网络和 Internet-->网络连接,打开本地连接(以太网)属性,将IPV4协议前面的对勾去掉,重启DR 这样D ...

  10. Posters TopCoder - 1684

    传送门 分析 首先我们不难想到1e4^5的暴力枚举,但显然这是不行的,于是我们考虑对于每一张海报肯定有一种最优情况使得它至少有一条边要么靠着板子的边要么靠着之前的某一张海报的边,这样我们便可以将复杂度 ...