Description –
解题思路 –
i
,
j
i,j
i,j 的范围是
1
0
9
10^9
109 ,所以要做离散化处理
然后先处理相同的
i
,
j
i,j
i,j 将他们并在一起
再处理不同的,如果本应不同的
i
,
j
i,j
i,j 在一个集中则不成立
代码 –
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
const int M = 2000100;
int t, n, o, s, tt, ss, z[M], fa[M];
struct hll
{
int x, y;
}b[M];
bool cmp1(hll xx, hll yy)
{
return xx.x < yy.x;
}
bool cmp2(hll xx, hll yy)
{
return xx.y < yy.y;
}
int find(int xx)
{
if (fa[xx] == xx) return xx;
return fa[xx] = find(fa[xx]);
}
void work()
{
scanf("%d", &n);
tt = s = ss = 0;
for (int i = 1; i <= M; ++i)
fa[i] = i;
for (int i = 1; i <= n; ++i)
{
int xx, yy;
scanf("%d%d%d", &xx, &yy, &z[i]);
b[++s] = {xx, i};
b[++s] = {yy, i};
}
sort(b + 1, b + s + 1, cmp1); //离散化
for (int i = 1; i <= s; ++i)
{
if (b[i].x != ss || i == 1) tt++, ss = b[i].x;
b[i].x = tt;
}
sort(b + 1, b + s + 1, cmp2);
for (int i = 1; i <= s; i += 2) //相同
{
if (z[b[i].y])
{
int aa = find(b[i].x);
int bb = find(b[i + 1].x);
if (aa < bb) fa[bb] = aa;
else fa[aa] = bb;
}
}
for (int i = 1; i <= s; i += 2) //不同
{
if (!z[b[i].y])
{
if (find(b[i].x) == find(b[i + 1].x))
{
printf("NO\n");
return ;
}
}
}
printf("YES\n");
}
int main()
{
scanf("%d", &t);
for (int i = 1; i <= t; ++i)
work();
return 0;
}