网格中的极大子矩形的另类解法

Posted 033000-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网格中的极大子矩形的另类解法相关的知识,希望对你有一定的参考价值。

http://www.doc88.com/p-9042008501060.html

论文说的很清楚

Cricket FieldUVALive - 2689 

附送代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<ctime>
#include<ctype.h>
#include<bitset>
#include<algorithm>
#include<numeric> //accumulate
#define endl "\n"
#define fi first
#define se second
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=100000+10;
int n,w,h;
struct Node
{
    int x,y;
};
Node p[maxn];
int main()
{

    //cout<<mid(25,5)<<endl;
    //cin.tie(0);
    //cout.tie(0);
    //ios_base::sync_with_stdio(false);
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>w>>h;
        for(int i=0; i<n; i++)
        {
            int x,y;
            cin>>x>>y;
            p[i]= {x,y};
        }
        p[n++]= {0,0},p[n++]= {w,h},p[n++]= {w,0},p[n++]= {0,h};
        sort(p,p+n,[](Node x,Node y)
        {
            return x.x<y.x;
        });
        int ans_x=1,ans_y=1,ans_l=1;
        for(int i=0; i<n; i++)
        {
            int up=h,down=0;
            for(int j=i+1; j<n; j++)
            {
                if(p[j].x==p[i].x)
                    continue;
                int ly=up-down;
                int lx=p[j].x-p[i].x;
                int ans=min(lx,ly);
                if(ans>ans_l)
                {
                    ans_l=ans;
                    ans_x=p[i].x;
                    ans_y=down;
                }
                if(p[i].y==p[j].y)
                    break;
                if(p[j].y>p[i].y)
                    up=min(up,p[j].y);
                if(p[j].y<p[i].y)
                    down=max(down,p[j].y);
            }
        }
        for(int i=n-1; i>=0; i--)
        {
            int up=h,down=0;
            for(int j=i+1; j<n; j++)
            {
                if(p[j].x==p[i].x)
                    continue;
                int ly=up-down;
                int lx=p[j].x-p[i].x;
                int ans=min(lx,ly);
                if(ans>ans_l)
                {
                    ans_l=ans;
                    ans_x=p[i].x;
                    ans_y=down;
                }
                if(p[i].y==p[j].y)
                    break;
                if(p[j].y>p[i].y)
                    up=min(up,p[j].y);
                if(p[j].y<p[i].y)
                    down=max(down,p[j].y);
            }
        }
        sort(p,p+n,[](Node x,Node y)
        {
            return x.y<y.y;
        });
        for(int i=0; i<n; i++)
        {
            int j=i;
            while(j<n&&p[j].y==p[i].y)
                j++;
            if(j==n)
                break;
            int len=min(p[j].y-p[i].y,w);
            if(len>ans_l)
            {
                ans_l=len;
                ans_x=0;
                ans_y=p[i].y;
            }
        }
        cout<<ans_x<< <<ans_y<< <<ans_l<<endl;
        if(T)
            cout<<endl;
    }
}



/*
void read()
{

    char c = getchar();
    int x = 0;
    for (; (c < 48 || c>57); c = getchar());
    for (; c > 47 && c < 58; c = getchar())
    {
        x = (x << 1) + (x << 3) + c - 48;
    }
    return x;
}
*/

 

以上是关于网格中的极大子矩形的另类解法的主要内容,如果未能解决你的问题,请参考以下文章

2018四川高考数学(全国卷3)理科21题以泰勒公式为命题背景和它的另类解法的瞎谈

最大子矩形

bzoj3039玉蟾宫 悬线法

antd DatePicker 为英文时的另类解法

奶牛浴场,最大子矩阵

优化Activity启动速度的另类解法