比赛 |
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;
}