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