二分部分的问题(0pt)
查看原帖
二分部分的问题(0pt)
558984
nannuke楼主2022/11/26 11:54
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,L;
bool flag=0;
vector<ll>A,B;
void dfs(const vector<ll>&x,const vector<ll>&y,ll d){
	if (flag || x.empty()){flag=1;return;}//已经确定当前方案行 
	if (!d)return;//不需要再放置正方形了 
	ll minx=2e9,miny=2e9,maxx=-2e9,maxy=-2e9;
	for (ll i=0;i<x.size();i++){
		minx=min(minx,x[i]);maxx=max(maxx,x[i]);
		miny=min(miny,y[i]);maxy=max(maxy,y[i]);
	}
	if (d==1){
		flag=(max(maxx-minx,maxy-miny)<=L);
		return;
	}
	vector<ll>x1,x2,x3,x4,y1,y2,y3,y4;
	for (ll i=0;i<x.size();i++){
		if (x[i]>minx+L || y[i]>miny+L)x1.push_back(x[i]),y1.push_back(y[i]);
		if (x[i]<maxx-L || y[i]>miny+L)x2.push_back(x[i]),y2.push_back(y[i]);
		if (x[i]>minx+L || y[i]<maxy-L)x3.push_back(x[i]),y3.push_back(y[i]);
		if (x[i]<maxx-L || y[i]<maxy-L)x4.push_back(x[i]),y4.push_back(y[i]);
	}
	dfs(x1,y1,d-1);
	dfs(x2,y2,d-1);
	dfs(x3,y3,d-1);
	dfs(x4,y4,d-1);
}
int main(){
	scanf("%lld",&n);
	for (ll i=1;i<=n;i++){
		ll a,b;scanf("%lld%lld",&a,&b);
		A.push_back(a);B.push_back(b);//放入容器 
//		cout << "flag" << endl;
	}
//	L=1;
//	cout << "||";
	ll l,r=20005;
//	while (!flag){
////		cout << L << ":";
//		flag=0;
//		dfs(x,y,3),L++;
//	}
	while (r-l>1){
		L=(r+l)/2;
//		cout << l << "," << r << ":" << L << endl;
		dfs(A,B,3);
		if (!flag)l=L;
		else r=L;
	}
	printf("%lld",L);
	return 0;
}

之前把二分换成暴力枚举40(另TLE),改成二分后就0了。

2022/11/26 11:54
加载中...