这份代码时间复杂度好像是 O(n4logn),但是为什么能AC?(还是说我复杂度算错了qwq
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N=1510;
struct node{
int x,y,op;
};
int n,m,a[N][N],f[N][N][2];
int t1[N],t2[N];
bool chek(node a,node b,int t){
int x1=a.x,y1=a.y,x2=b.x,y2=b.y;
if(a.op==b.op){
if(a.op){
if(y1<=y2&&y1>=y2-t+1&&x1==x2 || y2<=y1&&y2>=y1-t+1&&x1==x2) return 1;
}else{
if(x1<=x2&&x1>=x2-t+1&&y1==y2 || x2<=x1&&x2>=x1-t+1&&y1==y2) return 1;
}
}else{
if(a.op){
if(y1-t+1<=y2&&y2<=y1&&x2-t+1<=x1&&x1<=x2) return 1;
}else{
if(x1-t+1<=x2&&x2<=x1&&y2-t+1<=y1&&y1<=y2) return 1;
}
}
return 0;
}
bool check(int t){
vector<node> g;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(f[i][j][1]>=t) g.push_back({i,j,1});
if(f[i][j][0]>=t) g.push_back({i,j,0});
}
}
int len=g.size();
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(chek(g[i],g[j],t)) continue;
return 1;
}
}
return 0;
}
int main(){
// freopen("color.in","r",stdin);
// freopen("color.out","w",stdout);
memset(a,0,sizeof a);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
char cha;
cin>>cha;
if(cha=='.') a[i][j]=1,f[i][j][0]=f[i][j][1]=1;
else a[i][j]=0,f[i][j][0]=f[i][j][1]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(!a[i][j]) continue;
if(a[i-1][j]) f[i][j][0]=max(f[i][j][0],f[i-1][j][0]+1);
if(a[i][j-1]) f[i][j][1]=max(f[i][j][1],f[i][j-1][1]+1);
}
}
if(m==1){
int maxn=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(!a[i][j]) continue;
maxn=max(maxn,max(f[i][j][0],f[i][j][1]));
}
}
cout<<maxn;
return 0;
}
int l=1,r=n,k=0;
while(l<=r){
int mid=l+r>>1;
if(check(mid)){
l=mid+1,k=mid;
}else{
r=mid-1;
}
}
cout<<k;
return 0;
}