萌新求助,WA了第三个点
查看原帖
萌新求助,WA了第三个点
416192
kbzcz楼主2022/8/24 08:38

第一次发没人回,所以再发了一次。

#include<bits/stdc++.h>
using namespace std;
struct LSnode {
    int x,p,z;
}A[2000010],B[2000010];
int par[1000010],C[1000010];
bool cmp(LSnode x,LSnode y) {
    return x.x<y.x;
}
int find(int k) {
    if(k==par[k]) return k;
    return par[k]=find(par[k]);
}
void combine(int x,int y) {
    par[find(x)]=find(y);
}
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        memset(A,0,sizeof(A));
        memset(B,0,sizeof(B));
        memset(C,0,sizeof(C));
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) {
            int x,y,z;
            scanf("%d%d%d",&A[i*2-1].x,&A[i*2].x,&C[i]);
            A[i*2-1].p=i*2-1;A[i*2].p=i*2;
            B[i*2-1]=A[i*2-1];B[i*2]=A[i*2];
        }
        sort(A+1,A+1+2*n,cmp);
        A[1].z=1;
        for(int i=2;i<=2*n;i++) {
            if(A[i-1].x==A[i].x) A[i].z=A[i-1].z;
            else A[i].z=A[i-1].z+1; 
        }
        for(int i=1;i<=2*n;i++) B[A[i].p].z=A[i].z;
        for(int i=1;i<=A[2*n].z*2+1;i++) par[i]=i;
        for(int i=1;i<=n;i++) {
            int x=B[i*2-1].z,y=B[i*2].z;
            if(C[i]==1) {
                combine(x,y);
                combine(x+A[2*n].z,y+A[2*n].z);
            }
            else {
                combine(x+A[2*n].z,y);
                combine(x,y+A[2*n].z);
            }
        }
        bool bj=0;
        for(int i=1;i<=A[n*2].z;i++) {
            if(find(i)==find(i+A[2*n].z)) {
                printf("NO\n");
                bj=1;
                break;
            }
        }
        if(!bj) printf("YES\n");
    }
    return 0;
} 
2022/8/24 08:38
加载中...