为什么这个可以过
查看原帖
为什么这个可以过
1048875
GLY0912楼主2025/7/21 20:19

这份代码时间复杂度好像是 O(n4logn)O(n^4logn),但是为什么能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;
}
2025/7/21 20:19
加载中...