55分并查集求助
查看原帖
55分并查集求助
577987
caizhetong楼主2023/8/24 08:49
#include<bits/stdc++.h>
#define int long long
using namespace std;
long long md=1e9;
long long n,m,k,ans,ans1;
long long fa[1000010],dis[1000010],cl[1000010];
struct tx{
    long long x,y,c;
}q[1000010];
long long qpow(long long x,long long k)
{
    int num=x,ansq=1;
    for(int i=0;i<=40;i++)
    {
        if(k==0) break;
        if(k%2==1)
        {
            ansq=(ansq*num)%md;
        }
        k=k/2;
        num=(num*num)%md;
    }
    return ansq;
}
long long finds(long long x)
{
    if(fa[x]==x) return x;
    int a=finds(fa[a]);
    dis[x]=(dis[x]+dis[fa[x]])%2;
    fa[x]=a;
    return fa[x];
}
long long D(long long a,long long b)
{
    if(a==1) return b;
    else return a+m;
}
signed main()
{
    freopen("ti.in","r",stdin);
    ios::sync_with_stdio(0);

    cin>>n>>m>>k;
    for(int i=1;i<=k;i++)
    {
        cin>>q[i].x>>q[i].y>>q[i].c;
    }

    for(int i=1;i<=n+m+1;i++)
    {
        fa[i]=i;
        dis[i]=0;
        cl[i]=-1;
    }
    int num=n+m-2;
    cl[D(1,1)]=0;
    ans1=0;
    for(int i=1;i<=k;i++)
    {
        int u=q[i].x,v=q[i].y,c=q[i].c;
        if(u==1||v==1)
        {
            if(cl[finds(D(u,v))]==-1)
            {
                cl[finds(D(u,v))]=c xor dis[D(u,v)];
                num--;
            }
            else
            {
                if(cl[finds(D(u,v))] xor dis[D(u,v)]!=c)
                {
                    ans1=1;
                    break;
                }
            }
        }
        else
        {
            if(finds(D(u,1))==finds(D(1,v)))
            {
                if(cl[finds(D(u,1))]==-1) continue;
                int x=0;
                if(u%2==0&&v%2==0) x=1;
                x=cl[D(1,1)] xor x xor c;
                if(dis[D(u,1)] xor dis[D(1,v)]!=x)
                {
                    ans1=1;
                    break;
                }
            }
            else
            {
                fa[finds(D(u,1))]=finds(D(1,v));
                num--;
            }
        }
    }
    if(ans1==0) ans+=qpow(2,num);

    for(int i=1;i<=n+m+1;i++)
    {
        fa[i]=i;
        dis[i]=0;
        cl[i]=-1;
    }
    num=n+m-2;
    cl[D(1,1)]=1;
    ans1=0;
    for(int i=1;i<=k;i++)
    {
        int u=q[i].x,v=q[i].y,c=q[i].c;
        if(u==1||v==1)
        {
            if(cl[finds(D(u,v))]==-1)
            {
                cl[finds(D(u,v))]=c xor dis[D(u,v)];
                num--;
            }
            else
            {
                if(cl[finds(D(u,v))] xor dis[D(u,v)]!=c)
                {
                    ans1=1;
                    break;
                }
            }
        }
        else
        {
            if(finds(D(u,1))==finds(D(1,v)))
            {
                if(cl[finds(D(u,1))]==-1) continue;
                int x=0;
                if(u%2==0&&v%2==0) x=1;
                x=cl[D(1,1)] xor x xor c;
                if(dis[D(u,1)] xor dis[D(1,v)]!=x)
                {
                    ans1=1;
                    break;
                }
            }
            else
            {
                fa[finds(D(u,1))]=finds(D(1,v));
                num--;
            }
        }
    }
    if(ans1==0) ans+=qpow(2,num);
    cout<<ans;

    fclose(stdin);
    return 0;
}

2023/8/24 08:49
加载中...