奶牛浴场

这道题我用了扫描法,悬线法还没有填坑

首先想到尽量减少枚举量,也就是尽量让每个矩形都是有意义的,那么只有障碍点边缘有价值,所以只需要从左到右扫描一遍,得到的全部都是有意义的。

那么这种方法是否还有遗漏呢?

答案是肯定的

因为我们从左到右搜,肯定是以左边为准线,那么如果一直延伸到右边,那么如果是右边延伸到左边就会遗漏,同理,如果与左边界和右边界重合的矩形也会遗漏。

所以加入两个特判

1.从右边扫一遍,特判第一种情况

2.从上到下排序,相邻的两个点*横轴就是第二种情况

详细见代码

#include<bits/stdc++.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int r,c,n,ans;
struct node{int x,y;}a[5050];
bool cmp(node a,node b){return a.x<b.x;}
bool cmp1(node a,node b){return a.y<b.y;}
int main(){
    scanf("%d%d%d",&r,&c,&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
    a[++n].x=0;a[n].y=c;//注意的细节,为了方便处理
    a[++n].x=0;a[n].y=0;//在矩形边界都设置了障碍点
    a[++n].x=r;a[n].y=c;
    a[++n].x=r;a[n].y=0;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){//开始扫描
     int up=0,dn=c,v=a[i].x;
     for(int j=i+1;j<=n;j++){//从左到右
        ans=max(ans,(a[j].x-a[i].x)*(dn-up));//能延伸的最大子矩阵
        if(a[i].y==a[j].y)break;
        if(a[j].y>a[i].y)dn=min(dn,a[j].y);//修改上下边界
        else up=max(up,a[j].y);
     }
     up=0;dn=c;v=r-a[i].x;
     for(int j=i-1;j;j--){//从右到左
        ans=max(ans,(a[i].x-a[j].x)*(dn-up));
        if(a[i].y==a[j].y)break;
        if(a[j].y>a[i].y)dn=min(dn,a[j].y);
        else up=max(up,a[j].y);
     }
    }
    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<n;i++)ans=max(ans,(a[i+1].y-a[i].y)*r);//特判第二种情况
    printf("%d\n",ans);
}

原文地址:https://www.cnblogs.com/coder-cjh/p/11622934.html

时间: 2024-11-07 22:09:26

奶牛浴场的相关文章

洛谷P1578 奶牛浴场

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

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

奶牛浴场 描述 由于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大,那么就修改上界,反之,修改下界(具体的,可以看论文中的图,更直观些) 这里需要注意两个遗漏的地方(论文中也有特别提到) 就是

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> #incl

[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;

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

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

奶牛浴场,最大子矩阵

这题的正确做法是最大子矩阵,模板题 先介绍一下最大子矩阵的做法 这篇题解是蒟蒻把王知昆大佬的<浅谈极大化思想解决最大子矩阵>整理出来的 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