题意:

给定一系列约束条件,判断是否可以被同时满足,即不存在互斥行为。

 
 

分析:

常规并查集,通过条件可以看出非常巨大,数组不可能存下,因此第一步需要对进行离散化处理,但是呢...这道题的数据非常的水,仅仅对取个模也是可以过的。

 
 

代码:

#include<bits/stdc++.h>
using namespace std;
constexpr int mod = 1e9 +7;
//constexpr int mod2 = 998244353;
constexpr int MAXNe5 = 1e5 +7;
constexpr int MAXNe6 = 4000100;
#pragma region
inline long long read()
{
    char c = getchar();long long flag = 1, ans = 0;
    while(c < '0' || c > '9'){if(c == '-')flag = -1; c = getchar();}
    while(c >= '0' && c <= '9'){ans = ans * 10 + c - '0'; c = getchar();}
    return (ans * flag);
}
#pragma endregion
// C'est la vie
// map<int, int> fa;
int fa[MAXNe6 + 1];
void init() {
    for(int _i = 0; _i < MAXNe6; ++ _i) fa[_i] = _i;
}
int find(int x) {
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y) {
    fa[find(x)] = find(y);
}
int main() {
    int t = read();
    while(t --) {
        int n = read(), flag = 1;
        // fa.clear();
        init();
        vector<pair<int, int> > vep;
        while(n --) {
            int i = read(), j = read(), e = read();
            i %= MAXNe6;
            j %= MAXNe6;
            if(e) {
                if(i > j) swap(i, j);
                merge(i, j);
            } else {
                vep.push_back({i, j});
            }
        }
        for(auto i : vep) {
            int fa_x = find(fa[i.first]), fa_y = find(fa[i.second]);
            if(fa_x == fa_y) flag = 0;
        }
        if(flag) puts("YES");
        else puts("NO");
    }
    #ifndef ONLINE_JUDGE
    system("pause");
    #endif
}