离散化
先将数组升序排序,然后去重。
for(int i = 1; i <= n; i++)
{
scanf("%d%d%d", &a[i], &b[i], &c[i]);
d[++cnt] = a[i];
d[++cnt] = b[i];
}
sort(d+1, d+1+cnt);
cnt = unique(d + 1, d + cnt + 1) - (d+1);
init(cnt);
for(int i = 1; i <= n; i++)
{
a[i] = lower_bound(d+1, d+1+cnt, a[i]) - d;
b[i] = lower_bound(d+1, d+1+cnt, b[i]) - d;
}
例如
a
[
1
]
=
1
,
a
[
2
]
=
3
,
a
[
3
]
=
1
e
4
,
a
[
4
]
=
1
e
7
,
a
[
5
]
=
9
,
b
[
1
]
=
1
e
4
,
b
[
2
]
=
1
e
5
,
b
[
3
]
=
10
,
b
[
4
]
=
8
,
b
[
5
]
=
1
e
7
。
a[1] = 1,a[2] = 3,a[3] = 1e4,a[4] = 1e7, a[5] = 9, b[1] = 1e4,b[2] = 1e5,b[3] = 10,b[4] = 8,b[5] = 1e7。
a[1]=1,a[2]=3,a[3]=1e4,a[4]=1e7,a[5]=9,b[1]=1e4,b[2]=1e5,b[3]=10,b[4]=8,b[5]=1e7。
离散化后
a
[
1
]
=
1
,
a
[
2
]
=
2
,
a
[
3
]
=
6
,
a
[
4
]
=
8
,
a
[
5
]
=
4
,
b
[
1
]
=
6
,
b
[
2
]
=
7
,
b
[
3
]
=
5
,
b
[
4
]
=
3
,
b
[
5
]
=
8
。
a[1] = 1,a[2] = 2,a[3] = 6,a[4] = 8,a[5] = 4, b[1] = 6,b[2] = 7,b[3] = 5,b[4] = 3,b[5] = 8。
a[1]=1,a[2]=2,a[3]=6,a[4]=8,a[5]=4,b[1]=6,b[2]=7,b[3]=5,b[4]=3,b[5]=8。
例题
添加链接描述
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e6+5;
const ll mod = 1e9+7;
int n, fa[N], cnt, t, a[N], b[N], c[N], d[N];
void init(int n)
{
for(int i = 1; i <= n; i++)
fa[i] = i;
}
int find(int x)
{
return (x == fa[x] ? x : fa[x] = find(fa[x]));
}
void merge(int x, int y)
{
fa[find(x)] = find(y);
}
int main()
{
scanf("%d", &t);
while(t--)
{
cnt = 0;
scanf("%d", &n);
///离散化
for(int i = 1; i <= n; i++)
{
scanf("%d%d%d", &a[i], &b[i], &c[i]);
d[++cnt] = a[i];
d[++cnt] = b[i];
}
sort(d+1, d+1+cnt);
cnt = unique(d + 1, d + cnt + 1) - (d+1);
init(cnt);
for(int i = 1; i <= n; i++)
{
a[i] = lower_bound(d+1, d+1+cnt, a[i]) - d;
b[i] = lower_bound(d+1, d+1+cnt, b[i]) - d;
}
int flag = 1;
for(int i = 1; i <= n; i++)
if(c[i] == 1)
merge(a[i], b[i]);
for(int i = 1; i <= n; i++)
if(c[i] != 1)
{
int fx = find(a[i]), fy = find(b[i]);
if(fx == fy)
{
flag = 0;
break;
}
}
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}