比赛 2024暑假C班集训9 评测结果 AAAAATT
题目名称 矩形覆盖 最终得分 71
用户昵称 djyqjy 运行时间 2.060 s
代码语言 C++ 内存使用 2.46 MiB
提交时间 2024-07-09 11:55:13
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=60;
long long n,k;
struct dot
{
    long long x,y;
}ds[N];
long long anss=0x7fffffffffffffff;
int mark[N];
struct rec
{
    long long x1,x2,y1,y2;
}rs[N];
long long jsq;
long long xmin=550,xmax=-1,ymin=550,ymax=-1;
void dfs(long long c,long long h,long long m)
{
    cout<<c<<' '<<h<<' '<<m<<endl;
    if(c>n)
    {
        bool flag=1;
        for(int i=1;i<=n;i++)
        {
            if(!mark[i]) flag=0;
        }
        if(flag) anss=min(anss,m);
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(mark[i]) continue;
        for(int j=1;j<=jsq;j++)
        {
            if(rs[j].x1<=min(xmin,ds[i].x)&&rs[j].x2>=min(xmin,ds[i].x)&&rs[j].y1<=min(ymin,ds[i].y)&&rs[j].y2>=min(ymin,ds[i].y)||
               rs[j].x1<=max(xmax,ds[i].x)&&rs[j].x2>=max(xmax,ds[i].x)&&rs[j].y1<=min(ymin,ds[i].y)&&rs[j].y2>=min(ymin,ds[i].y)||
               rs[j].x1<=min(xmin,ds[i].x)&&rs[j].x2>=min(xmin,ds[i].x)&&rs[j].y1<=max(ymax,ds[i].y)&&rs[j].y2>=max(ymax,ds[i].y)||
               rs[j].x1<=max(xmax,ds[i].x)&&rs[j].x2>=max(xmax,ds[i].x)&&rs[j].y1<=max(ymax,ds[i].y)&&rs[j].y2>=max(ymax,ds[i].y)) continue;
        }
        long long xx=xmin,xxx=xmax,yy=ymin,yyy=ymax;
        xmin=min(xmin,ds[i].x);
        xmax=max(xmax,ds[i].x);
        ymin=min(ymin,ds[i].y);
        ymax=max(ymax,ds[i].y);
        mark[i]=1;
        if(c+1<=n) dfs(c+1,h,m);
        rs[++jsq]=(rec){xmin,xmax,ymin,ymax};
        xmin=550;xmax=-1;ymin=550;ymax=-1;
        dfs(c+1,h+1,m+(xmax-xmin)*(ymax-ymin));
        mark[i]=0;
        jsq--;
        xmin=xx;xmax=xxx;ymin=yy;ymax=yyy;
    }
    return;
}
int main()
{
    freopen("jxfg.in","r",stdin);
    freopen("jxfg.out","w",stdout); 
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%lld%lld",&ds[i].x,&ds[i].y);
    if(k==4)
    {
        dfs(1,0,0);
        printf("%lld",anss);
        return 0;
    }
    long long minx=510,miny=510,maxx=-1,maxy=-1;
    for(int i=1;i<=n;i++)
    {
        minx=min(minx,ds[i].x);
        miny=min(miny,ds[i].y);
        maxx=max(maxx,ds[i].x);
        maxy=max(maxy,ds[i].y);
    }
    if(k==1)
    {
        printf("%lld",1ll*(maxx-minx)*(maxy-miny));
        return 0;
    }
    else if(k==2)
    {
        long long ans=0x7fffffffffffffff;
        for(int i=minx;i<maxx;i++)
        {
            long long minx1=510,maxx1=-1,miny1=510,maxy1=-1,minx2=510,maxx2=-1,miny2=510,maxy2=-1;
            for(int j=1;j<=n;j++)
            {
                if(ds[j].x<=i)
                {
                    minx1=min(minx1,ds[j].x);
                    maxx1=max(maxx1,ds[j].x);
                    miny1=min(miny1,ds[j].y);
                    maxy1=max(maxy1,ds[j].y);
                }
                else
                {
                    minx2=min(minx2,ds[j].x);
                    maxx2=max(maxx2,ds[j].x);
                    miny2=min(miny2,ds[j].y);
                    maxy2=max(maxy2,ds[j].y);
                }
            }
            ans=min(ans,1ll*(maxx1-minx1)*(maxy1-miny1)+1ll*(maxx2-minx2)*(maxy2-miny2));
        }
        for(int i=miny;i<maxy;i++)
        {
            long long minx1=510,maxx1=-1,miny1=510,maxy1=-1,minx2=510,maxx2=-1,miny2=510,maxy2=-1;
            for(int j=1;j<=n;j++)
            {
                if(ds[j].y<=i)
                {
                    minx1=min(minx1,ds[j].x);
                    maxx1=max(maxx1,ds[j].x);
                    miny1=min(miny1,ds[j].y);
                    maxy1=max(maxy1,ds[j].y);
                }
                else
                {
                    minx2=min(minx2,ds[j].x);
                    maxx2=max(maxx2,ds[j].x);
                    miny2=min(miny2,ds[j].y);
                    maxy2=max(maxy2,ds[j].y);
                }
            }
            ans=min(ans,1ll*(maxx1-minx1)*(maxy1-miny1)+1ll*(maxx2-minx2)*(maxy2-miny2));
        }
        printf("%lld",ans);
        return 0;
    }
    else if(k==3)
    {
        long long ans=0x7fffffffffffffff;
        for(int i=minx;i<maxx;i++)
        {
            long long minx1=510,maxx1=-1,miny1=510,maxy1=-1,minx2=510,maxx2=-1,miny2=510,maxy2=-1;
            for(int j=1;j<=n;j++)
            {
                if(ds[j].x<=i)
                {
                    minx1=min(minx1,ds[j].x);
                    maxx1=max(maxx1,ds[j].x);
                    miny1=min(miny1,ds[j].y);
                    maxy1=max(maxy1,ds[j].y);
                }
                else
                {
                    minx2=min(minx2,ds[j].x);
                    maxx2=max(maxx2,ds[j].x);
                    miny2=min(miny2,ds[j].y);
                    maxy2=max(maxy2,ds[j].y);
                }
            }
            if(minx1!=maxx1)
            {
                for(int j=minx1;j<maxx1;j++)
                {
                    long long minx3=510,maxx3=-1,miny3=510,maxy3=-1,minx4=510,maxx4=-1,miny4=510,maxy4=-1;
                    for(int k=1;k<=n;k++)
                    {
                        if(ds[k].x<=j)
                        {
                            minx3=min(minx3,ds[k].x);
                            maxx3=max(maxx3,ds[k].x);
                            miny3=min(miny3,ds[k].y);
                            maxy3=max(maxy3,ds[k].y);
                        }
                        else if(ds[k].x<=i)
                        {
                            minx4=min(minx4,ds[k].x);
                            maxx4=max(maxx4,ds[k].x);
                            miny4=min(miny4,ds[k].y);
                            maxy4=max(maxy4,ds[k].y);
                        }
                    }
                    ans=min(ans,(maxx3-minx3)*(maxy3-miny3)+(maxx4-minx4)*(maxy4-miny4)+(maxx2-minx2)*(maxy2-miny2));
                }
            }
            if(minx2!=maxx2)
            {
                for(int j=minx2;j<maxx2;j++)
                {
                    long long minx3=510,maxx3=-1,miny3=510,maxy3=-1,minx4=510,maxx4=-1,miny4=510,maxy4=-1;
                    for(int k=1;k<=n;k++)
                    {
                        if(ds[k].x>j)
                        {
                            minx3=min(minx3,ds[k].x);
                            maxx3=max(maxx3,ds[k].x);
                            miny3=min(miny3,ds[k].y);
                            maxy3=max(maxy3,ds[k].y);
                        }
                        else if(ds[k].x>i)
                        {
                            minx4=min(minx4,ds[k].x);
                            maxx4=max(maxx4,ds[k].x);
                            miny4=min(miny4,ds[k].y);
                            maxy4=max(maxy4,ds[k].y);
                        }
                    }
                    ans=min(ans,(maxx3-minx3)*(maxy3-miny3)+(maxx4-minx4)*(maxy4-miny4)+(maxx1-minx1)*(maxy1-miny1));
                }
            }
            if(miny1!=maxy1)
            {
                for(int j=miny1;j<maxy1;j++)
                {
                    long long minx3=510,maxx3=-1,miny3=510,maxy3=-1,minx4=510,maxx4=-1,miny4=510,maxy4=-1;
                    for(int k=1;k<=n;k++)
                    {
                       if(ds[k].x<=i)
                       {
                           if(ds[k].y<=j)
                           {
                                minx3=min(minx3,ds[k].x);
                                maxx3=max(maxx3,ds[k].x);
                                miny3=min(miny3,ds[k].y);
                                maxy3=max(maxy3,ds[k].y);
                            }
                            else
                            {
                                minx4=min(minx4,ds[k].x);
                                maxx4=max(maxx4,ds[k].x);
                                miny4=min(miny4,ds[k].y);
                                maxy4=max(maxy4,ds[k].y);
                            }
                        }
                    }
                    ans=min(ans,(maxx3-minx3)*(maxy3-miny3)+(maxx4-minx4)*(maxy4-miny4)+(maxx2-minx2)*(maxy2-miny2));
                }
            }
            if(miny2!=maxy2)
            {
                for(int j=miny2;j<maxy2;j++)
                {
                    long long minx3=510,maxx3=-1,miny3=510,maxy3=-1,minx4=510,maxx4=-1,miny4=510,maxy4=-1;
                    for(int k=1;k<=n;k++)
                    {
                       if(ds[k].x>i)
                       {
                           if(ds[k].y<=j)
                           {
                                minx3=min(minx3,ds[k].x);
                                maxx3=max(maxx3,ds[k].x);
                                miny3=min(miny3,ds[k].y);
                                maxy3=max(maxy3,ds[k].y);
                            }
                            else
                            {
                                minx4=min(minx4,ds[k].x);
                                maxx4=max(maxx4,ds[k].x);
                                miny4=min(miny4,ds[k].y);
                                maxy4=max(maxy4,ds[k].y);
                            }
                        }
                    }
                    ans=min(ans,(maxx3-minx3)*(maxy3-miny3)+(maxx4-minx4)*(maxy4-miny4)+(maxx1-minx1)*(maxy1-miny1));
                }
            }
        }
        for(int i=miny;i<maxy;i++)
        {
            long long minx1=510,maxx1=-1,miny1=510,maxy1=-1,minx2=510,maxx2=-1,miny2=510,maxy2=-1;
            for(int j=1;j<=n;j++)
            {
                if(ds[j].y<=i)
                {
                    minx1=min(minx1,ds[j].x);
                    maxx1=max(maxx1,ds[j].x);
                    miny1=min(miny1,ds[j].y);
                    maxy1=max(maxy1,ds[j].y);
                }
                else
                {
                    minx2=min(minx2,ds[j].x);
                    maxx2=max(maxx2,ds[j].x);
                    miny2=min(miny2,ds[j].y);
                    maxy2=max(maxy2,ds[j].y);
                }
            }
            if(minx1!=maxx1)
            {
                for(int j=minx1;j<maxx1;j++)
                {
                    long long minx3=510,maxx3=-1,miny3=510,maxy3=-1,minx4=510,maxx4=-1,miny4=510,maxy4=-1;
                    for(int k=1;k<=n;k++)
                    {
                        if(ds[k].y<=i)
                        {
                            if(ds[k].x<=j)
                            {
                                minx3=min(minx3,ds[k].x);
                                maxx3=max(maxx3,ds[k].x);
                                miny3=min(miny3,ds[k].y);
                                maxy3=max(maxy3,ds[k].y);
                            }
                            else
                            {
                                minx4=min(minx4,ds[k].x);
                                maxx4=max(maxx4,ds[k].x);
                                miny4=min(miny4,ds[k].y);
                                maxy4=max(maxy4,ds[k].y);
                            }
                        }
                    }
                    ans=min(ans,(maxx3-minx3)*(maxy3-miny3)+(maxx4-minx4)*(maxy4-miny4)+(maxx2-minx2)*(maxy2-miny2));
                }
            }
            if(minx2!=maxx2)
            {
                for(int j=minx2;j<maxx2;j++)
                {
                    long long minx3=510,maxx3=-1,miny3=510,maxy3=-1,minx4=510,maxx4=-1,miny4=510,maxy4=-1;
                    for(int k=1;k<=n;k++)
                    {
                        if(ds[k].y>i)
                        {
                            if(ds[k].x<=j)
                            {
                                minx3=min(minx3,ds[k].x);
                                maxx3=max(maxx3,ds[k].x);
                                miny3=min(miny3,ds[k].y);
                                maxy3=max(maxy3,ds[k].y);
                            }
                            else
                            {
                                minx4=min(minx4,ds[k].x);
                                maxx4=max(maxx4,ds[k].x);
                                miny4=min(miny4,ds[k].y);
                                maxy4=max(maxy4,ds[k].y);
                            }
                        }
                    }
                    ans=min(ans,(maxx3-minx3)*(maxy3-miny3)+(maxx4-minx4)*(maxy4-miny4)+(maxx1-minx1)*(maxy1-miny1));
                }
            }
            if(miny1!=maxy1)
            {
                for(int j=miny1;j<maxy1;j++)
                {
                    long long minx3=510,maxx3=-1,miny3=510,maxy3=-1,minx4=510,maxx4=-1,miny4=510,maxy4=-1;
                    for(int k=1;k<=n;k++)
                    {
                        if(ds[k].y<=j)
                        {
                            minx3=min(minx3,ds[k].x);
                            maxx3=max(maxx3,ds[k].x);
                            miny3=min(miny3,ds[k].y);
                            maxy3=max(maxy3,ds[k].y);
                        }
                        else if(ds[k].y<=i)
                        {
                            minx4=min(minx4,ds[k].x);
                            maxx4=max(maxx4,ds[k].x);
                            miny4=min(miny4,ds[k].y);
                            maxy4=max(maxy4,ds[k].y);
                        }
                    }
                    ans=min(ans,(maxx3-minx3)*(maxy3-miny3)+(maxx4-minx4)*(maxy4-miny4)+(maxx2-minx2)*(maxy2-miny2));
                }
            }
            if(miny2!=maxy2)
            {
                for(int j=miny2;j<maxy2;j++)
                {
                    long long minx3=510,maxx3=-1,miny3=510,maxy3=-1,minx4=510,maxx4=-1,miny4=510,maxy4=-1;
                    for(int k=1;k<=n;k++)
                    {
                        if(ds[k].y>i)
                        {
                            minx3=min(minx3,ds[k].x);
                            maxx3=max(maxx3,ds[k].x);
                            miny3=min(miny3,ds[k].y);
                            maxy3=max(maxy3,ds[k].y);
                        }
                        else if(ds[k].y>i)
                        {
                            minx4=min(minx4,ds[k].x);
                            maxx4=max(maxx4,ds[k].x);
                            miny4=min(miny4,ds[k].y);
                            maxy4=max(maxy4,ds[k].y);
                        }
                    }
                    ans=min(ans,(maxx3-minx3)*(maxy3-miny3)+(maxx4-minx4)*(maxy4-miny4)+(maxx1-minx1)*(maxy1-miny1));
                }
            }
        }
        printf("%lld",ans);
        return 0;
    }
    return 0;
}