并查集50分求助
查看原帖
并查集50分求助
259625
kk1501201楼主2023/8/20 10:39

RT

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+1;
int fa[N],area[N],n,m;
char c[N];
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int zip(int i,int j)//二维压缩成一维 
{
    return (i-1)*m+j;
}
void init(int n)//初始化 
{
    for(int i=1;i<=n;i++) fa[i]=i;
}      
int find(int i)//查询父节点 
{
    if(fa[i]==i) return i;
    else
    {
        fa[i]=find(fa[i]);
        return fa[i];
    }
}
void unionn(int i,int j)//合并 
{
    int k=0;
    if(find(i)!=find(j)) k=area[find(i)];
    fa[find(i)]=find(j);
    area[fa[j]]+=k;
}
void compare(int num)//比较k个点面积大小 
{
    int x,y,ans=0,maxn=0;
    for(int i=1;i<=num;i++)
    {
        x=read();y=read();
        if(c[zip(x,y)]=='*') continue;
        int k=area[fa[zip(x,y)]];
        if(k>maxn)
        {
            maxn=k;
            ans=i;
        }
    }
    if(ans==0) cout<<1<<endl;
    else cout<<ans<<endl;
    return ;
} 
int qx[4]={-1,0,0,1},qy[4]={0,-1,1,0};
void change(int num)
{
    while(num--)
    {
        int x,y;
        x=read();y=read();
        int k=zip(x,y);
        if(c[k]=='.') 
        {
            area[fa[k]]-=1;
            c[k]='*';
        }
        else
        {
            c[k]='.';
            for(int i=0;i<4;i++)
            {
                int nx=x+qx[i],ny=y+qy[i];
                if(nx<=0||ny<=0||nx>n||ny>m) continue;
                int k1=zip(nx,ny);
                if(area[fa[k1]]!=-1)unionn(k,k1);
            } 
        }
    }
    return ; 
}
bool vis[N];
void dfs(int x,int y,int d)
{
    int k=zip(x,y);
    if(vis[k]||x<=0||y<=0||x>n||y>m||c[k]=='*') return; 
    vis[k]=true;
    unionn(k,d);
    if(x>1)dfs(x-1,y,d);
    if(x<n)dfs(x+1,y,d);
    if(y>1)dfs(x,y-1,d);
    if(y<m)dfs(x,y+1,d);
}
int main()
{
    memset(area,-1,sizeof(area));
    n=read();m=read();
    init(n*m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int k=zip(i,j);
            cin>>c[k];
            if(c[k]=='.') 
            {
                area[k]=1;
            }
        }
    } 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int k=zip(i,j);
            dfs(i,j,k);
        }
    } 
    int Q,op,q;
    Q=read();
    while(Q--)
    {
        op=read();q=read();
        if(op==1) compare(q);
        if(op==2) change(q);
    }
    return 0;
}
2023/8/20 10:39
加载中...