WA 20pts 没过样例求助
查看原帖
WA 20pts 没过样例求助
335552
Christophe_楼主2023/11/2 21:17
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=1e6+10,M=5,INF=1e12;
int n,k,ans=INF;
struct Spot{
	int x,y;
	bool operator<(const Spot &B)const{
		return x<B.x||(x==B.x&&y>B.y);
	}
}s[N];
struct Square{
	Spot l,r;
	bool tag;
	void add(int i){
		if(tag==0){
			l=r=s[i];
			tag=1;
			return;
		}
		int x=s[i].x,y=s[i].y;
		if(y>r.y) r.x=x,r.y=y;
		else if(y<l.y) l.y=y,r.x=x;
		else r.x=x;
	}
	int area(){
		return abs((r.x-l.x)*(r.y-l.y));
	}
}sq[M];
bool chk(Square A,Square B){//Not Cross
	return B.l.x>A.r.x||B.l.y>A.r.y||B.r.x<A.l.x||B.r.y<A.l.y;
}
void dfs(int i,int sum){
//	printf("* %d %d\n",i-1,sum);
//	for(int j=1;j<=k;++j){
//		printf("(%d,%d) (%d,%d)\n",sq[j].l.x,sq[j].l.y,sq[j].r.x,sq[j].r.y);
//	}
	if(sum>=ans) return;
	if(i>n){
		ans=min(ans,sum);
		return;
	}
	for(int j=1;j<=k;++j){
		int s0=sq[j].area();
		Square sq0=sq[j];
		sq[j].add(i);
		int flag=0;
		for(int w=1;w<=k;++w)
			if(w!=j&&!chk(sq[w],sq[j])&&sq[w].tag)
				flag=1;
		if(flag) continue;
		int s1=sq[j].area();
		dfs(i+1,sum+s1-s0);
		sq[j]=sq0;
	}
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;++i) cin>>s[i].y>>s[i].x;
	sort(s+1,s+n+1);
//	cout<<'\n';
//	for(int i=1;i<=n;++i){
//		cout<<s[i].x<<' '<<s[i].y<<'\n';
//	}
//	cout<<'\n';
	dfs(1,0);
	cout<<ans;
	return 0;
}

交换了 x,y 更方便调试, 中间的 sum 出现了负数,感觉很诡异 qwq

2023/11/2 21:17
加载中...