1 条题解
-
0
#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
- 上传者