【P1369】矩形(贪心)

蒟蒻现在连DP都做不出来了,就只能做一些XJB贪心题,这个题题目向非常友好,100的数据范围一看就是让你跑O(n^4)的做法的,然而实际上并不是那么多,大约是,额,反正要快不少。

没什么好说的,直接枚举矩形的左上右下寻找出所有的矩形,然后暴力枚举出最大的那个就可以了,要注意矩形的顶点可能覆盖了某些点,在计算的时候要减去重复的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define re register
#define maxn 1000007
#define ll long long
using namespace std;
int n,m;
struct point
{
    int x,y,id;
};
point a[1001];
int d,ans,map[301][301],sh[1001][1001],sl[1001][1001],maxx,x,y;
int main()
{
    cin>>n;
    for(re int i=1;i<=n;i++)
    {
        cin>>x>>y;
        map[x][y]=1;
    }
    for(re int i=1;i<=100;i++)
    {
        for(re int j=1;j<=100;j++)
        {
            if(map[i][j])
            {
                sh[i][j]=sh[i][j-1]+1;
                sl[i][j]=sl[i-1][j]+1;
            }else
            {
                sh[i][j]=sh[i][j-1];
                sl[i][j]=sl[i-1][j];
            }
        }
    }
    for(re int k=1;k<=100-1;k++)
    {
        for(re int i=1;i<=100-1;i++)
        {
            for(re int j=i+1;j<=100;j++)
            {
                for(re int x=k+1;x<=100;x++)
                {
                    ans=(sh[x][j]-sh[x][i])+(sh[k][j]-sh[k][i])+(sl[x][j]-sl[k][j])+(sl[x][i]-sl[k][i]);
                    if(map[k][i])
                    ans--;
                    if(map[x][i])
                    ans--;
                    if(map[k][j])
                    ans--;
                    if(map[x][j])
                    ans--;
                    maxx=max(ans,maxx);
                }
            }
        }
    }
    cout<<maxx;
}

 

posted @ 2018-02-07 15:59  ~victorique~  阅读(145)  评论(0编辑  收藏  举报
Live2D