WA 60 求助,悬赏可洽谈
查看原帖
WA 60 求助,悬赏可洽谈
539211
lzyqwq楼主2022/11/12 18:58
#include<bits/stdc++.h>
using namespace std;
#define N 1002
char ma[N][N];
int n,q,mp[N][N],sum[N][N],sz[N][N],dx[]={0,0,1},dy[]={0,1,0},cnt,tot,rt[N*N],f[21][N*N],mi[21][N*N],ok,d[N*N],lg[N*N];
struct edge{
    int u,v,w;
    bool operator<(edge a){
        return w>a.w;
    }
}e[N*N*2];
struct Edge{
    int v,w;
};
vector<Edge>g[N*N];
int id(int x,int y){
    return (x-1)*n+y;
}
int find(int x){
    return rt[x]<0?x:rt[x]=find(rt[x]);
}
void merge(int x,int y){
    x=find(x);
    y=find(y);
    if(rt[x]>rt[y]){
        swap(x,y);
    }
    rt[x]+=rt[y];
    rt[y]=x;
}
void dfs(int x,int fa){
    if(fa){
        for(int i=1;i<=lg[d[x]];++i){
            f[i][x]=f[i-1][f[i-1][x]];
            mi[i][x]=min(mi[i-1][x],mi[i-1][f[i-1][x]]);
        }
    }
    for(auto i:g[x]){
        if(i.v^fa){
            d[i.v]=d[f[0][i.v]=x]+1;
            mi[0][i.v]=i.w;
            dfs(i.v,x);
        }
    }
}
int lca(int x,int y){
    if(d[x]<d[y]){
        swap(x,y);
    }
    int ans=1e9;
    while(d[x]^d[y]){
        ans=min(ans,mi[lg[d[x]-d[y]]][x]);
        x=f[lg[d[x]-d[y]]][x];
    }
    if(x==y){
        return ans;
    }
    for(int i=lg[d[x]];~i;--i){
        if(f[i][x]^f[i][y]){
            ans=min({ans,mi[i][x],mi[i][y]});
            x=f[i][x];
            y=f[i][y];
        }
    }
    return ans;
}
int main(){
    memset(rt,-1,sizeof rt);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%s",ma[i]+1);
        for(int j=1;j<=n;++j){
            lg[id(i,j)]=log2(id(i,j));
            if(ma[i][j]^'.'){
                mp[i][j]=1;
            }else{
                ++ok;
            }
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mp[i][j];
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            if(!mp[i][j]){
                int l=0,r=n/2;
                while(l<=r){
                    int m=l+r>>1;
                    if(i+m>n||j+m>n||i-m<1||j-m<1||sum[i+m][j+m]-sum[i+m][j-m-1]-sum[i-m-1][j+m]+sum[i-m-1][j-m-1]){
                        r=m-1;
                    }else{
                        sz[i][j]=m;
                        l=m+1;
                    }
                }
                sz[i][j]=sz[i][j]*2+1;
            }
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            if(!mp[i][j]){
                for(int k=1;k<=2;++k){
                    int x=i+dx[k],y=j+dy[k];
                    if(x>0&&x<=n&&y>0&&y<=n&&!mp[x][y]){
                        e[++cnt]={id(i,j),id(x,y),min(sz[i][j],sz[x][y])};
                    }
                }
            }
        }
    }
    sort(e+1,e+1+cnt);
    for(int i=1;i<=cnt;++i){
        if(find(e[i].u)^find(e[i].v)){
            merge(e[i].u,e[i].v);
            g[e[i].u].push_back({e[i].v,e[i].w});
            g[e[i].v].push_back({e[i].u,e[i].w});
            if(++tot==ok-1){
                break;
            }
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            if(!mp[i][j]&&!f[0][id(i,j)]){
                dfs(id(i,j),0);
            }
        }
    }
    scanf("%d",&q);
    for(int i=1,ax,ay,bx,by;i<=q;++i){
        scanf("%d%d%d%d",&ax,&ay,&bx,&by);
        if(find(id(ax,ay))^find(id(bx,by))){
            puts("0");
            continue;
        }
        printf("%d\n",lca(id(ax,ay),id(bx,by)));
    }
}
2022/11/12 18:58
加载中...