1 条题解

  • 0
    @ 2026-5-24 12:05:35
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int n,ff[1010][1010][4],dp[1010][1010],fa[2000010],val[2000010];
    int find(int x){
    	return fa[x]=(fa[x]==x?x:find(fa[x]));
    }
    string s[1010];
    int get(int x,int y){
    	return (x-1)*n+y;
    }
    struct E{
    	int x,y,v;
    }e[2000010];
    bool cmp(E a,E b){
    	return a.v>b.v;
    }
    vector<int> e2[2000010];
    int st[2000010][28],dep[2000010];
    void dfs(int x,int xfa){
    	dep[x]=dep[xfa]+1;
    	st[x][0]=xfa;
    	for(int i=1;i<=25;i++)st[x][i]=st[st[x][i-1]][i-1];
    	for(int y:e2[x]){
    		dfs(y,x);
    	}
    }
    int lca(int x,int y){
    	if(dep[x]<dep[y])x^=y^=x^=y;
    	for(int i=25;i>=0;i--){
    		if(dep[st[x][i]]>=dep[y]){
    			x=st[x][i];
    		}
    	} 
    	if(x==y)return x;
    	for(int i=25;i>=0;i--){
    		if(st[x][i]!=st[y][i]){
    			x=st[x][i];
    			y=st[y][i];
    		}
    	}
    	return st[x][0];
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>s[i];
    		s[i]=" "+s[i];
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++)if(s[i][j]=='.'){
    			ff[i][j][0]=min(ff[i-1][j][0],min(ff[i][j-1][0],ff[i-1][j-1][0]))+1;
    		}
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=n;j;j--)if(s[i][j]=='.'){
    			ff[i][j][1]=min(ff[i-1][j][1],min(ff[i][j+1][1],ff[i-1][j+1][1]))+1;
    		}
    	}
    	for(int i=n;i;i--){
    		for(int j=1;j<=n;j++)if(s[i][j]=='.'){
    			ff[i][j][2]=min(ff[i+1][j][2],min(ff[i][j-1][2],ff[i+1][j-1][2]))+1;
    		}
    	}
    	for(int i=n;i;i--){
    		for(int j=n;j;j--)if(s[i][j]=='.'){
    			ff[i][j][3]=min(ff[i+1][j][3],min(ff[i][j+1][3],ff[i+1][j+1][3]))+1;
    		}
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			dp[i][j]=min({ff[i][j][0],ff[i][j][1],ff[i][j][2],ff[i][j][3]});
    			dp[i][j]=dp[i][j]*2-1;
    		}
    	}
    	int id=0;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++)if(s[i][j]=='.'){
    			if(j<n&&s[i][j+1]=='.')e[++id]={get(i,j),get(i,j+1),min(dp[i][j],dp[i][j+1])};
    			if(i<n&&s[i+1][j]=='.')e[++id]={get(i,j),get(i+1,j),min(dp[i][j],dp[i+1][j])}; 
    		}
    	}
    	for(int i=1;i<=n*n;i++)fa[i]=i;
    	sort(e+1,e+1+id,cmp);
    	int cnt=n*n;
    	for(int i=1;i<=id;i++){
    		int x=e[i].x,y=e[i].y,v=e[i].v;
    		if(find(x)!=find(y)){
    			cnt++;
    			fa[cnt]=cnt; 
    			val[cnt]=v;
    			e2[cnt].push_back(find(x));
    			e2[cnt].push_back(find(y));
    			fa[find(x)]=fa[find(y)]=cnt;
    		}
    	}
    	for(int i=cnt;i;i--){
    		if(!dep[i])dfs(i,0);
    	}
    	int q;
    	cin>>q;
    	while(q--){
    		int x1,y1,x2,y2;
    		cin>>x1>>y1>>x2>>y2;
    		if(find(get(x1,y1))!=find(get(x2,y2))){
    			cout<<"0\n";
    			continue;
    		}
    		int l=lca(get(x1,y1),get(x2,y2));
    		cout<<val[l]<<'\n';
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    6462
    时间
    4000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    9
    已通过
    3
    上传者