Vijos 1055 奶牛浴场

Description

求一个不覆盖指定点的最大子矩阵,\(n,m \leqslant 3\times 10^5,S \leqslant 5\times 10^3\) .

Sol

没有名字的算法都叫xjblg算法?

枚举每个点成为极大子矩阵边界的情况,然后维护上下边界.

还有一种情况就是左右边界是矩阵两边的情况,需要预处理一下.

时间复杂度 \(O(S^2)\) 空间复杂度 \(O(S)\)

Code

#include<cstdio>
#include<utility>
#include<algorithm>
#include<functional>
#include<iostream>
using namespace std;

#define mpr make_pair
typedef pair< int,int > pr;
typedef long long LL;
const int N = 5005;

int n,m,k;LL ans;
pr g[N];
int x[N],y[N];

inline int in(int x=0,char ch=getchar()){ while(ch>‘9‘ || ch<‘0‘) ch=getchar();
	while(ch>=‘0‘ && ch<=‘9‘) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();return x; }
int main(){
	n=in(),m=in(),k=in();
	for(int i=1,u,v;i<=k;i++) u=in(),v=in(),g[i]=mpr(u,v),y[i]=v;
	g[++k]=mpr(0,0),y[k]=0,g[++k]=mpr(0,m),y[k]=m,g[++k]=mpr(n,0),y[k]=0,g[++k]=mpr(n,m),y[k]=m;
	sort(y+1,y+k+1);
	for(int l=1,r;l<=k;l=r+1){
		r=l;
		while(r<k && y[l]==y[r+1]) ++r;
		ans=max(ans,(LL)m*(y[l]-y[l-1]));
	}
	sort(g+1,g+k+1,less<pr>());
	for(int i=1;i<=k;i++){
		int u=0,d=n;
		for(int j=i+1;j<=k;j++){
			ans=max(ans,(LL)(g[j].first-g[i].first)*(d-u));
			if(g[j].second>g[i].second) d=min(d,g[j].second);
			else if(g[j].second<g[i].second) u=max(u,g[j].second);
			else break;
		}
	}
	sort(g+1,g+k+1,greater<pr>());
	for(int i=1;i<=k;i++){
		int u=0,d=n;
		for(int j=i+1;j<=k;j++){
			ans=max(ans,(LL)(g[i].first-g[j].first)*(d-u));
			if(g[j].second>g[i].second) d=min(d,g[j].second);
			else if(g[j].second<g[i].second) u=max(u,g[j].second);
			else break;
		}
	}cout<<ans<<endl;
	return 0;
}

  

时间: 2024-10-12 04:25:52

Vijos 1055 奶牛浴场的相关文章

Vijos 1055 奶牛浴场 最大子矩阵 算♂法①

题意:链接 方法:最大子矩阵之算♂法① 解析: 首先谈到最大子矩阵,我们可能会想到之前做过的盖房子?,那道DP求解的题目. 然而这种题目当然有更高♂端的算法. 比如接下来要谈到的算法①. 我们先来观察数据范围,n,m<=30000,这下就玩完了,怎么dp? 一下子就D掉了你原来的算法,真是不留情面. 那么我们来介绍一种新的算法. 首先谈暴力,枚举各种坏点,但这种的复杂度呢?甚至可能达到6次方,所以怎么优化呢? 按照经验,这种坐标图排个序就能降下复杂度什么的. 于是有神犇介绍了s^2复杂度的算法,

vijos p1005 奶牛浴场[ 极大化思想]

奶牛浴场 描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是产奶点可以位于浴

洛谷P1578 奶牛浴场

P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是

P1578 奶牛浴场

题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是产奶点可以位于浴场的轮

Vijos1055 奶牛浴场(极大化思想求最大子矩形)

思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路也很简单 先根据x排序 之后两重循环,枚举i后的每一个点j到i可以形成的矩形面积 怎么求这个矩形面积呢? 非常简单,miny,maxy,分别表示纵坐标的上下界 如果枚举的点j比i的y大,那么就修改上界,反之,修改下界(具体的,可以看论文中的图,更直观些) 这里需要注意两个遗漏的地方(论文中也有特别提到) 就是

[luoguP1578] 奶牛浴场(DP)

传送门 O(s2)算法 详见论文 王知昆--浅谈用极大化思想解决最大子矩形问题 我就复制你能把我怎么样QAQ #include <cstdio> #include <iostream> #include <algorithm> #define N 5010 #define max(x, y) ((x) > (y) ? (x) : (y)) #define min(x, y) ((x) < (y) ? (x) : (y)) int L, W, n, ans;

奶牛浴场

这道题我用了扫描法,悬线法还没有填坑 首先想到尽量减少枚举量,也就是尽量让每个矩形都是有意义的,那么只有障碍点边缘有价值,所以只需要从左到右扫描一遍,得到的全部都是有意义的. 那么这种方法是否还有遗漏呢? 答案是肯定的 因为我们从左到右搜,肯定是以左边为准线,那么如果一直延伸到右边,那么如果是右边延伸到左边就会遗漏,同理,如果与左边界和右边界重合的矩形也会遗漏. 所以加入两个特判 1.从右边扫一遍,特判第一种情况 2.从上到下排序,相邻的两个点*横轴就是第二种情况 详细见代码 #include<

奶牛浴场,最大子矩阵

这题的正确做法是最大子矩阵,模板题 先介绍一下最大子矩阵的做法 这篇题解是蒟蒻把王知昆大佬的<浅谈极大化思想解决最大子矩阵>整理出来的 wzk大佬论文最重要的两个定义 有效子矩形:内部不包含障碍点的子矩形 极大有效子矩形:即是一个有效子矩形,切不能在找到一个包含他的有效子矩形 原文地址:https://www.cnblogs.com/xzx-1228/p/11765500.html

acm刷题记录

我感觉毫无目的地刷题没有意义,便记录每周的刷题,以此激励自己! ----------6.6-------- [vijos1055]奶牛浴场                                      最大化               推荐IOI论文<浅谈用极大化思想解决最大子矩形问题> codeforces 679B - Bear and Tower of Cubes      xjb搞 codeforces  680A - Bear and Five Cards