题目

悬线法的思想——即扫描线的思想,每个矩阵必定是由两个障碍来构成左右边界或者上下边界。

如果此两个障碍组成了左右边界,枚举这两个障碍中途更新这两个障碍之间的矩阵上下边界,并且更新最大值。

考虑如何线性求出两个障碍的矩阵上下边界,

我们可以把障碍按x坐标排序,然后对于每个障碍,都找x比他大的障碍找一遍,也就是悬线向右扩展,每找一个就更新一下上边界或下边界也就是更新悬线的上下端点, 因为越向右,矩阵的上边界和下边界就逼近矩阵的宽减少,但是矩阵的长却是一直增大的,因此需要每次都更新最大值。

组成了上下边界同理,最终将漏解的情况加上, 就求出了最优解。

#include <bits/stdc++.h>
using namespace std;
struct dat {
int x, y;
} a[1010000];
int l, w, n, maxn;
bool cmp1 (dat a, dat b)
{return a.y < b.y;}
bool cmp2 (dat a, dat b)
{return a.x < b.x;}
inline void init()
{
scanf("%d%d", &l, &w);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d", &a[i].x, &a[i].y);
a[++n].x = 0, a[n].y = w;
a[++n].x = l, a[n].y = w;
a[++n].x = 0, a[n].y = 0;
a[++n].x = l, a[n].y = 0;
}
int main()
{
init();
sort(a + 1, a + 1 + n, cmp2);//复杂度O(n^2)枚举两个障碍里的面积, 用扫描的思想解决,
for (int i = 1; i <= n; i++)//high为最低的点,low为最高的点 pos为向右扩展的悬线长度,不需要向左,因为前面的向右等同于后面的向左
{
int high, low, pos;
high = 0, low = w, pos = l - a[i].x;//pos*(low-high)为当前矩阵面积最大值,
for (int j = i + 1; j <= n; j++)
{
if (pos * (low - high) <= maxn) break;//如果当前最优解都不能比maxn大,break
maxn = max(maxn, (low - high) * (a[j].x - a[i].x));
if (a[j].y >= a[i].y)
low = min(low, a[j].y);
else
high = max(high, a[j].y);
}
}
sort(a + 1, a + 1 + n, cmp1);
for (int i = 1; i <= n; i++)
{
int lef, rig, pos;
lef = 0, rig = l, pos = w - a[i].y;//lef为最左边的点,rig为当前最右边的点,pos为向下扩展的悬线长度。
for (int j = i + 1; j <= n; j++)
{
if (pos * (rig - lef) <= maxn) break;
maxn = max(maxn, (rig - lef) * (a[j].y - a[i].y));
if (a[j].x >= a[i].x)
rig = min(rig, a[j].x);
else
lef = max(lef, a[j].x);
}
}
for (int i = 1; i < n; i++)//有漏解的情况。
maxn = max( maxn, l * ( a[i + 1].y - a[i].y ) );
printf("%d", maxn);
return 0;
}

洛谷P1578 奶牛牧场(悬线法思想)的更多相关文章

  1. 洛谷P1169 棋盘制作(悬线法)

    题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ...

  2. [WC2002][洛谷P1578]奶牛浴场

    洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...

  3. 洛谷 P1578 奶牛浴场

    https://www.luogu.org/problemnew/show/P1578 题解 另外这题有一些小坑,洛谷的题解里面有讲 #pragma GCC optimize("Ofast& ...

  4. 洛谷P1578 奶牛浴场

    P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...

  5. 洛谷 P1578 奶牛浴场 —— 最大子矩形

    题目:https://www.luogu.org/problemnew/show/P1578 枚举左边界,向右枚举右边界,同时不断限制上下边界,最后右边界是整个图的边界: 由于没有做左边界是整个图的边 ...

  6. 洛谷 P1578 奶牛浴场 题解

    题面 1.定义有效子矩形为内部不包含任何障碍点且边界与坐标轴平行的子矩形.如图所示,第一个是有效子矩形(尽管边界上有障碍点),第二个不是有效子矩形(因为内部含有障碍点). 2.极大有效子矩形:一个有效 ...

  7. [DP专题]悬线法

    参考:https://blog.csdn.net/twtsa/article/details/8120269 先给出题目来源:(洛谷) 1.p1387 最大正方形 2.P1169 棋盘制作 3.p27 ...

  8. 【题解】洛谷P1169 [ZJOI2007] 棋盘制作(坐标DP+悬线法)

    次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵 ...

  9. 洛谷 P1169 [ZJOI2007]棋盘制作 (悬线法)

    和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169  p4147  p2701  p1387 #include<cstdio> #include<algorithm& ...

随机推荐

  1. CentOS升级Python2.6到Python2.7并安装pip[转载]

    貌似CentOS 6.X系统默认安装的Python都是2.6版本的?平时使用以及很多的库都是要求用到2.7版本或以上,所以新系统要做的第一件事必不可少就是升级Python啦!在这里做个简单的升级操作记 ...

  2. (转)MySQL中char(36)被认为是GUID导致的BUG及解决方案

    有时候在使用Toad或在程序中,偶尔会遇到如下的错误: System.FormatExceptionGUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xx ...

  3. Blend Grid行列拖拽控制宽高

    原文:Blend Grid行列拖拽控制宽高 看效果 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width=&qu ...

  4. Jenkins的使用(三)-------Publish over SSH和Publish over FTP

    七.构建后操作 1.使用Publish over SSH 1.左边菜单栏    Manage Jenkins --->ManagePlugins--->可选插件,然后搜索 Publish ...

  5. 我是如何一步步编码完成万仓网ERP系统的(二)前端框架

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  6. Java面试必问通信框架NIO,原理详解

    NIO 流与块 通道与缓冲区 缓冲区状态变量 文件 NIO 实例 选择器 套接字 NIO 实例 内存映射文件 NIO与IO对比 Path Files NIO 新的输入/输出 (NIO) 库是在 JDK ...

  7. Python学习笔记之从文件中读取数据

    10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python 知识,其中每一行都以“In Python you can”打头.将这个文件命名为learnin ...

  8. JSON.stringify & JSON.parse 简析

    以前用到JSON的场景也不少,但是没有仔细的研究过,这几天趁着一个需求用到了,就整理了一下相关用法. 一. JSON.stringify() 1. 语法  JSON.stringify(value[, ...

  9. Object.assign的使用

    语法: Object.assign(target, ...sources)//target目标对象,sources源对象,返回值目标对象 使用说明: 如果目标对象中的属性具有相同的键,则属性将被源对象 ...

  10. 详解Vue中的虚拟DOM

    摘要: 什么是虚拟DOM? 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 Vue.js 2.0引入Virtual DOM,比Vue.js 1.0的初始渲染速度提升了2-4倍,并 ...