题意:
给定一系列约束条件,判断是否可以被同时满足,即不存在互斥行为。
分析:
常规并查集,通过条件可以看出和非常巨大,数组不可能存下,因此第一步需要对进行离散化处理,但是呢...这道题的数据非常的水,仅仅对取个模也是可以过的。
代码:
#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 }