BZOJ-4581: [Usaco2016 Open]Field Reduction

[文章目录]

Description

给定平面上N个点。现你可以删去至多3个点,接着你需要用一个矩形包含所有的点,点可以在矩形的边上,矩形的边须与坐标轴平行。最小化矩形的面积并输出这个值。5 ≤ N ≤ 50000, 1 ≤ X_i, Y_i ≤ 40000

面积=(xmax-xmin)*(ymax-ymin)
那么每次删的点必须对一个参数答案有贡献,所以每层只有4个,直接搜索就好了。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int n,x[51000],y[51000];
long long ans=0x3f3f3f3f3f3f3f3fll;
bool v[51000];
void solve(int left)
{
    int xmx,xmi,ymx,ymi; xmi=ymi=inf; xmx=ymx=0; int a,b,c,d;
    for(int i=1;i<=n;++i) if(!v[i])
    {
        if(x[i]>xmx) xmx=x[i],a=i;
        if(x[i]<xmi) xmi=x[i],b=i;
        if(y[i]>ymx) ymx=y[i],c=i;
        if(y[i]<ymi) ymi=y[i],d=i;
    }
    ans=min(ans,1ll*(xmx-xmi)*(ymx-ymi)); if(left==0) return ;
    v[a]=1; solve(left-1); v[a]=0;
    v[b]=1; solve(left-1); v[b]=0;
    v[c]=1; solve(left-1); v[c]=0;
    v[d]=1; solve(left-1); v[d]=0;
}
int main()
{
    scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d",x+i,y+i);
    solve(3); printf("%lld",ans);
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注