首页 > 其他分享 >P1578 奶牛浴场

P1578 奶牛浴场

时间:2024-08-16 15:48:58浏览次数:14  
标签:P1578 y2 浴场 边界 int 矩阵 ++ y1 奶牛

题面链接

最大子子矩形问题

首先一些概念

1.有效子矩阵: 内部不包含任何障碍点,且边界与坐标轴平行的子矩阵

2.极大子矩阵:一个有效子矩阵,如果不包含它,且比它大的有效子矩阵,则为极大有效子矩阵

3.最大有效子矩阵:所有有效矩阵中最大面积的子矩阵

极大化思想

定理1. 有一个障碍点的矩形中的最大子矩阵一定是极大子矩阵

定理2.一个极大矩阵的四边一定不能向外扩展,即每条边碰到障碍点或者边界

算法1

由于极大子矩形的4条边一定覆盖障碍点(或者边界) ——— 因此我们可以枚举每一个障碍点

1.把矩形的四个边界点也加入到障碍点的集合当中

s[++k].x = 0, s[k].y = 0;   //左上边界
s[++k].x = 0,s[k].y = m;   //右上边界
s[++k].x = n, s[k].y = 0;   //左下边界
s[++k].x = n, s[k].y = m;   //右下边界

2.对横坐标进行排序

3.枚举极大子矩阵的左边界,从左到右扫描每一个障碍点

4.不断修改可行的上下边界,从而得到所有以这个定点为左边界的极大子矩阵

一开始上下边界取的是牛场(矩形)的上下边界

更新上下边界

1.当前点的纵坐标比定点大 ,即当前点位于定点的上方,修改上边界为当前点的纵坐标

2.当前点位于定点的下方,则修改下边界为当前带你的纵坐标

3.当前点和定点位于同一位置,则结束扫描

for(int i=1;i<=k;i++)
{
    x1 = s[i].x;
    y1 = 0;    
    y2 = m;  
   for(int j=i+1;j<=k;j++)
    {
      x2 = s[j].x;
      if(s[i].y > s[j].y) y1 = max(y1,s[j].y);
      else y2 = min(y2,s[j].y);
      ans = max(ans,(x2-x1) * (y2-y1));
    }
}

5.枚举极大子矩阵的右边界,从右到左扫描每一个障碍点

由于从左到右扫描后可能会出现遗漏的情况,如极大子矩形的左边界是牛场的左边界,有边界覆盖一个障碍点

6.更新答案

ans = max(ans, (上边界 - 下边界 )* 横坐标之差)

7.还有,极大子矩阵的左右边界与矩形的左右边界重合的情况;

我们将按照纵坐标进行排序,枚举相邻的两个纵坐标之间的极大子矩形

for(int i=1;i<=k-1;i++){
		ans = max(ans,n*(s[i+1].y-s[i].y));
	}

C++ Code

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5+10;

int n,m,k;
int ans;
struct Point {
	int x,y;
}s[N];

bool cmp1(Point a, Point b){
	if(a.x != b.x) return a.x < b.x;
	return a.y < b.y; 
}
bool cmp2(Point a, Point b){
	if(a.y != b.y) return a.y < b.y;
	return a.x < b.y;
}
int main(){
	cin>>n>>m>>k;
	
	for(int i=1;i<=k;i++){
		int x,y;
		cin>>x>>y;
		s[i] = {x,y};
	} 
	//加入矩形的四个边界点
	s[++k].x = 0, s[k].y = 0;
	s[++k].x = 0, s[k].y = m;
	s[++k].x = n, s[k].y = 0;
	s[++k].x = n, s[k].y = m;
	
	int x1,x2,y1,y2;
	
	sort(s+1,s+k+1,cmp1);
	
	for(int i=1;i<=k;i++){
		x1 = s[i].x; 
		y1 = 0, y2 = m;
		for(int j=i+1;j<=k;j++){
			x2 = s[j].x;
			ans = max(ans,(x2-x1)*(y2-y1));
			if(s[i].y > s[j].y) y1 = max(y1,s[j].y);
			else y2 = min(y2,s[j].y);
		}
	}
	
	for(int i=k;i>=1;i--){
		x1 = s[i].x;
		y1=0,y2=m;
		for(int j=i-1;j>=1;j--){
			x2 = s[j].x;
			ans = max(ans,(x1-x2)*(y2-y1));  //右边减去左边
			if(s[i].y > s[j].y) y1 = max(y1,s[j].y);
			else y2 = min(y2,s[j].y); 
		}
	} 
	
	sort(s+1,s+1+k,cmp2);
	
	for(int i=1;i<=k-1;i++){
		ans = max(ans,n*(s[i+1].y-s[i].y));
	}
	
	cout<<ans;
	return 0;
}

标签:P1578,y2,浴场,边界,int,矩阵,++,y1,奶牛
From: https://www.cnblogs.com/ltphy-/p/18363007

相关文章

  • P1460 健康的荷斯坦奶牛 Healthy Holsteins
    题目描述点这里文字描述农民John以拥有世界上最健康的奶牛为傲。他知道每种饲料中所包含的牛所需的最低的维他命量是多少。请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少。给出牛所需的最低的维他命量,输出喂给牛需要哪些种类的饲料,且所需的饲料剂量最少......
  • 洛谷P1842 [USACO05NOV] 奶牛玩杂技
    [USACO05NOV]奶牛玩杂技题目背景FarmerJohn养了\(N\)头牛,她们已经按\(1\simN\)依次编上了号。FJ所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团的演出。可奶牛们很快发现她们那笨拙的蹄子根本无法在钢丝或晃动的的秋千上站稳(她们还尝试过把自己装在大炮里发射......
  • 爷爷奶奶每年的酸奶牛奶和人参
    牛奶是7.9一瓶 一年是2,883.5酸奶是4元一瓶,5-15-5.30、9.1-10.1每天需要1.5瓶  4元*45天*1.5=2706.1-8.30每天需要2瓶4*90*2=720 大约需要3,873元。每年5月5号有优惠券。记得去app领-----------------------------------------------人参买多多上万宝庭的,......
  • [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包
    凸包,顾名思义,就是凸多边形包围,具体定义见OI-wiki(既是周长最小也是面积最小)有Graham算法和Andrew算法,后者精度更高常数更小(因为不涉及求角度)Andrew算法:1.将点排序(横坐标为第一关键字,纵坐标为第二关键字)2.从左到右维护上半部分,再从右到左维护下半部分。具体见OI-wiki。最后说的......
  • 题解:洛谷 P1843 奶牛晒衣服
    题解:洛谷P1843奶牛晒衣服标签:二分,贪心题意给定一个数列,每秒可以将所有数减\(a\),也可以选择一个数减\(b\),二者可同时进行,求让所有数小于等于\(0\)的最小秒数。思路要求最小的秒数,也就是刚好所有数字小于等于\(0\),且尽量大。这个秒数具有单调性,考虑二分答案。二分的......
  • 以奶牛为鉴,作物GS之路任重道远
    植物和动物在GS实施上有很大的差异,这一点很多学者做过系统的比较,只能说各有优劣。不管如何,动物的GS走在了前列,有很多地方值得植物借鉴。GS技术最早在奶牛育种得到广泛应用,因此我们来看看奶牛GS的发展及国内外现状。2001年,Meuwissen等首次提出GS的概念,其基本思想是利用覆盖个......
  • 三十一 1375. 奶牛回家 (最短路)
    1375.奶牛回家(最短路)略importjava.util.*;publicclassMain{privatestaticfinalintN=60,INF=0x3f3f3f3f;privatestaticintn=52,m;privatestaticint[][]g=newint[N][N];privatestaticint[]dist=newint[N];priva......
  • 十一 2060. 奶牛选美 (DFS)
    十一2060.奶牛选美(DFS)思路:使用dfs找出两个相邻的斑点,搜索过的点改为'.'防止重复统计,然后依次遍历两个斑点内的点,找出最小曼哈顿距离。importjava.util.*;publicclassMain{staticintn,m;staticchar[][]g;staticList<int[]>[]points=newAr......
  • P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包
    原题链接题解这么优质的文章我写什么题解好难解释必然性感觉像模拟??code#include<bits/stdc++.h>usingnamespacestd;intq[100005]={0};structnode{doublex,y;}a[100005];doubledis(intb,intc){nodei=a[b],j=a[c];returnsqrt((i.x-j.x)*(i.x-......
  • 贪心算法(算法竞赛、蓝桥杯)--奶牛晒衣服
    1、B站视频链接:A28贪心算法P1843奶牛晒衣服_哔哩哔哩_bilibili题目链接:奶牛晒衣服-洛谷#include<bits/stdc++.h>usingnamespacestd;priority_queue<int>q;//用大根堆维护湿度的最大值intn,a,b;inttim,maxn;intmain(){ scanf("%d%d%d",&n,&a,&b); for......