三下乡好累呜呜
晚上还是回来补了这道昨天开的题 话说我好菜 这种题都要做半天
原因竟是我不会剪枝 hh
我真是个铸币
其实最开始看错题了
没看到k
想出来了一个理论:肯定我们一个矩形内只有两个点 挺好想的而且与本题无关 那就不证了
这题给的是有k的
那我们dfs时可以想:把n个点放进k个矩阵 这样就完了
对了还要判断重合 其实我最开始写的那个也可以判断
是这样的:
map<int,int>mpx;
map<int,int>mpy;
for(int m=1;m<=k;m++){
for(int j=a[m][0];j<=a[m][2];j++){
mpx[j]++;
if(mpx[j]>=2&&mpy[j]>=2)goto out;
}
for(int j=a[m][1];j<=a[m][3];j++){
mpy[j]++;
if(mpy[j]>=2&&mpx[j]>=2)goto out;
}
}
但是后面因为T了我就想着优化 改成了判断顶点在不在其他矩阵里就好了
a[i][0]=min(a[i][0],x),a[i][1]=min(a[i][1],y);a[i][2]=max(a[i][2],x),a[i][3]=max(a[i][3],y);
for(int s=1;s<=k;s++) {
for (int m = s+1; m <= k ; m++) {
if(a[m][0]==2e9)break;
auto x1 = a[s][0], y1 = a[s][1], x2 = a[s][2], y2 = a[s][3];
auto x3=min(a[m][0],a[m][2]),y3=min(a[m][1],a[m][3]),x4=max(a[m][2],a[m][0]),y4=max(a[m][3],a[m][1]);
if(x1>=x3&&x1<=x4&&y1>=y3&&y1<=y4)goto out;
if(x2>=x3&&x2<=x4&&y2>=y3&&y2<=y4)goto out;
if(x2>=x3&&x2<=x4&&y1>=y3&&y1<=y4)goto out;
if(x1>=x3&&x1<=x4&&y2>=y3&&y2<=y4)goto out;
}
}
最后附上完整代码!
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
const int M = 5e5+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
int n,k,a[N][4];
pair<int,int>p[N];
int res=2e9;
void dfs(int area,int step){
if(area>=res)return;
if(step==n+1){
int sum=0;
for(int i=1;i<=k;i++){
if(a[i][0]==a[i][2]&&a[i][1]==a[i][3])return;
sum+=abs((a[i][0]-a[i][2])*(a[i][1]-a[i][3]));
}
res=min(sum,res);
return;
}
for(int i=1;i<=k;i++){
auto x=p[step].first,y=p[step].second;
int xq=a[i][0],yq=a[i][1],xp=a[i][2],yp=a[i][3];
a[i][0]=min(a[i][0],x),a[i][1]=min(a[i][1],y);a[i][2]=max(a[i][2],x),a[i][3]=max(a[i][3],y);
for(int s=1;s<=k;s++) {
for (int m = s+1; m <= k ; m++) {
if(a[m][0]==2e9)break;
auto x1 = a[s][0], y1 = a[s][1], x2 = a[s][2], y2 = a[s][3];
auto x3=min(a[m][0],a[m][2]),y3=min(a[m][1],a[m][3]),x4=max(a[m][2],a[m][0]),y4=max(a[m][3],a[m][1]);
if(x1>=x3&&x1<=x4&&y1>=y3&&y1<=y4)goto out;
if(x2>=x3&&x2<=x4&&y2>=y3&&y2<=y4)goto out;
if(x2>=x3&&x2<=x4&&y1>=y3&&y1<=y4)goto out;
if(x1>=x3&&x1<=x4&&y2>=y3&&y2<=y4)goto out;
}
}
if(xq!=2e9)dfs(area+abs((a[i][0]-a[i][2])*(a[i][1]-a[i][3]))-abs((xq-xp)*(yq-yp)),step+1);
else dfs(area,step+1);
out:
a[i][0]=xq,a[i][1]=yq,a[i][2]=xp,a[i][3]=yp;
}
}
signed main() {
fast
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>p[i].first>>p[i].second;
for(int i=0;i<N;i++){
a[i][0]=a[i][1]=2e9;
a[i][2]=a[i][3]=-2e9;
}
dfs(0,1);
cout<<res<<endl;
return 0^0;
}
最后祝自己 周日考试rp++