萌新求助水题
查看原帖
萌新求助水题
342873
有趣的问题楼主2022/8/11 18:31

RT,思路和题解类似,后面大数据都过了,Sub2WA了两个点,求大佬指教。

代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,t,ans;
struct tree{
	int x,y;
}tr[105];
bool check(int i,int j){
	if(i==j)return 1;
	if(tr[i].x>tr[j].x)swap(i,j);
	for(int k=1;k<=t;k++){
		if(k==i||k==j)continue;
		if(tr[k].x>tr[i].x&&tr[k].x<tr[j].x&&tr[k].y>min(tr[i].y,tr[j].y)&&tr[k].y<max(tr[i].y,tr[j].y))return 1;
	}
	return 0;
}
signed main(){
	cin>>n>>t;
	for(int i=1;i<=t;i++){
		cin>>tr[i].x>>tr[i].y;
	}
	for(int i=1;i<t;i++){
		for(int j=i+1;j<=t;j++){
			if(check(i,j))continue;
			int lx=abs(tr[i].x-tr[j].x)-1;
			int up=max(min(tr[i].y,tr[j].y)-lx,1ll);
			int down=min(n,max(tr[i].y,tr[j].y)+lx);
			for(int k=1;k<=t;k++){
				if(k==i||k==j)continue;
				if(tr[k].x>min(tr[i].x,tr[j].x)&&tr[k].x<max(tr[i].x,tr[j].x)){
					if(tr[k].y<max(tr[j].y,tr[i].y))up=max(up,tr[k].y+1);
					else down=min(down,tr[k].y-1);
				}
			}
			if(down-up+1>=lx)ans=max(ans,lx);
			lx=abs(tr[i].y-tr[j].y)-1;
			up=max(min(tr[i].x,tr[j].x)-lx,1ll);
			down=min(n,max(tr[i].x,tr[j].x)+lx);
			for(int k=1;k<=t;k++){
				if(k==i||k==j)continue;
				if(tr[k].y>min(tr[i].y,tr[j].y)&&tr[k].y<max(tr[i].y,tr[j].y)){
					if(tr[k].x<max(tr[i].x,tr[j].x))up=max(up,tr[k].x+1);
					else down=min(down,tr[k].x-1);
				}
			}
			if(down-up+1>=lx)ans=max(ans,lx);
		}
	}
	for(int i=1;i<=t;i++){
		bool f1=0,f2=0,f3=0,f4=0;
		int x1=tr[i].x-1,x2=n-tr[i].x,y1=tr[i].y-1,y2=n-tr[i].y;
		for(int j=1;j<=t;j++){
			if(i==j)continue;
			if(tr[j].x<=max(x1,y1)&&tr[j].y<=max(x1,y1))f1=1;
			if(tr[j].x<=max(x1,y2)&&n-tr[j].y<max(x1,y2))f2=1;
			if(n-tr[j].x<max(x2,y1)&&tr[j].y<=max(x2,y1))f3=1;
			if(n-tr[j].x<max(x2,y2)&&n-tr[j].y<max(x2,y2))f4=1;
		}
		if(!f1){
			ans=max(ans,max(x1,y1));
		} 
		if(!f4){
			ans=max(ans,max(x2,y2));
		}
		if(!f2){
			ans=max(ans,max(x1,y2));
		}
		if(!f3){
			ans=max(ans,max(x2,y1));
		}
	}
	cout<<ans;
	return 0;
}
2022/8/11 18:31
加载中...