洛谷P1578 奶牛牧场(悬线法思想)
悬线法的思想——即扫描线的思想,每个矩阵必定是由两个障碍来构成左右边界或者上下边界。
如果此两个障碍组成了左右边界,枚举这两个障碍中途更新这两个障碍之间的矩阵上下边界,并且更新最大值。
考虑如何线性求出两个障碍的矩阵上下边界,
我们可以把障碍按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 奶牛牧场(悬线法思想)的更多相关文章
- 洛谷P1169 棋盘制作(悬线法)
		题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ... 
- [WC2002][洛谷P1578]奶牛浴场
		洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ... 
- 洛谷 P1578 奶牛浴场
		https://www.luogu.org/problemnew/show/P1578 题解 另外这题有一些小坑,洛谷的题解里面有讲 #pragma GCC optimize("Ofast& ... 
- 洛谷P1578 奶牛浴场
		P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ... 
- 洛谷 P1578 奶牛浴场 —— 最大子矩形
		题目:https://www.luogu.org/problemnew/show/P1578 枚举左边界,向右枚举右边界,同时不断限制上下边界,最后右边界是整个图的边界: 由于没有做左边界是整个图的边 ... 
- 洛谷 P1578 奶牛浴场 题解
		题面 1.定义有效子矩形为内部不包含任何障碍点且边界与坐标轴平行的子矩形.如图所示,第一个是有效子矩形(尽管边界上有障碍点),第二个不是有效子矩形(因为内部含有障碍点). 2.极大有效子矩形:一个有效 ... 
- [DP专题]悬线法
		参考:https://blog.csdn.net/twtsa/article/details/8120269 先给出题目来源:(洛谷) 1.p1387 最大正方形 2.P1169 棋盘制作 3.p27 ... 
- 【题解】洛谷P1169 [ZJOI2007] 棋盘制作(坐标DP+悬线法)
		次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵 ... 
- 洛谷 P1169 [ZJOI2007]棋盘制作 (悬线法)
		和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169 p4147 p2701 p1387 #include<cstdio> #include<algorithm& ... 
随机推荐
- vue router 常用操作
			1. 普通路由 const routes = [ { path: '/index', component: index } ] 2. 重定向 redirect const routes = [ { ... 
- wordcount实例
			scala的wordcount实例 package com.wondersgroup.myscala import scala.actors.{Actor, Future} import scala. ... 
- Java中转换为二进制的几种实现
			public class HexUtil { private static final String[] DIGITS_UPPER = {"0", "1", & ... 
- VS报错,Metadata file 'xxx.dll' could not be found
			错误提示“Metadata file 'xxx.dll' could not be found”步骤如下:1.右键单击解决方案,然后单击“属性”.2.单击左侧的配置.3.确保选中了它找不到的项目的“生 ... 
- ASP.NET Core中使用MialKit实现邮件发送
			# 导包 首先我们需要导入 MailKit NuGet包,NuGet安装包命令在下方拓展介绍中. # 引用命名空间 using MailKit.Net.Smtp; using MimeKit; # 邮 ... 
- Python 绘图与可视化 matplotlib text 与transform
			Text 为plots添加文本或者公式,反正就是添加文本了 参考链接:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.text.html#ma ... 
- python 排序 插入排序与希尔排序
			希尔排序是插入排序的升级版,先来了解插入排序 插入排序 算法思想: 插入排序再面对几乎已经有序的数据效率非常高,可以达到线性排序的效率 将数组元素插入已经有序的部分中,具体的过程是在有序的部分中通过比 ... 
- docker基础应用
			环境: centos 7 docker 19.03.0-beta3 192.168.10.10 关于如何安装docker请参考:https://www.cnblogs.com/caesar-id/ ... 
- Golang中,Aes加解密
			今天在用Golang解析php那边用Aes加密的一个key.网上大多是用base64将结果编码一下.而且用到了向量.我php 那边没有用到向量.所以golang这边也是要去掉的.参考网站的改了下.能够 ... 
- Mybatis源码解析(一) —— mybatis与Spring是如何整合的?
			Mybatis源码解析(一) -- mybatis与Spring是如何整合的? 从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ... 
