70,求助带权并查集qwq
查看原帖
70,求助带权并查集qwq
239192
淸梣ling楼主2021/12/29 22:58

没有de出错,#4 #6 #10 的点WA了,求助dalao~~~

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N =10100;
struct Uni
{
    int fa[N+100];
    bool d[N+100];
    int area;
    Uni(int n)
    {
        area=n;
        for(int i=1; i<=N; i++)
        fa[i]=i, d[i]=false;
    }
    int find(int x)
    {
        if(x==fa[x]) return fa[x];
        int r=find(fa[x]); d[x]^=d[fa[x]];
        return fa[x]=r;
    }
    void merge(int x, int y, bool f)
    {
        if(find(x)!=find(y)) --area;
        fa[find(x)]=find(y);
        d[find(x)]=d[x]^d[y]^f;
    }
};

ll x[5100],y[5100];
bool f[5100];
ll s[10100],sum;

int main()
{
    int n,m;
    int i;

    cin>>n>>m;
    for(i=1; i<=m; i++)
    {
        char c[10];
        scanf("%lld%lld%s", &x[i], &y[i], c);
        f[i]=(c[0]=='o');
        s[i*2-1]=x[i]-1; s[i*2]=y[i];
    }

    sort(s+1, s+1+m*2);
    sum=unique(s+1, s+1+m*2)-s-1;
    Uni u(sum);

    for(i=1; i<=m; i++)
    {
        int l=lower_bound(s+1, s+1+sum, x[i]-1)-s;
        int r=lower_bound(s+1, s+1+sum, y[i])-s;
        if(u.find(l)!=u.find(r))
        u.merge(l, r, f[i]);
        else if((u.d[l]^u.d[r])!=f[i])
        break;
    }
    cout<<i-1;
    return 0;
}
2021/12/29 22:58
加载中...