Luogu P1955 [NOI2015]程序自动分析



思路
这个题要是数据范围小的话那就可以是黄题或者绿题了。但是,良心的出题人偏偏要把数据范围搞得那么大、、无语……
这个题就是在把数据离散化之后,在把1的情况全部丢进并查集里,特判关于0的情况即可(这里可以离散化的原因是我们并不需要这些数据的真实大小,只需要知道它们的相对大小即可)。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 1000005
int t, n, f[MAXN];
int c[MAXN << 1];
struct node{
int x, y, e;
} inp[MAXN];
bool cmp(const node a,const node b){
return a.e > b.e;
}
inline int get_father(int k){
return f[k] == k ? k : f[k] = get_father(f[k]);
}
int main(){
scanf("%d", &t);
while(t--){
int cnt = 0;
memset(f, 0, sizeof(f));
memset(c, 0, sizeof(c));
scanf("%d", &n);
for (int i = 1; i <= n;++i){
scanf("%d%d", &inp[i].x, &inp[i].y);
scanf("%d", &inp[i].e);
c[++cnt] = inp[i].x, c[++cnt] = inp[i].y;
}
std::sort(c + 1, c + cnt + 1);
int tot = std::unique(c + 1, c + cnt + 1) - c - 1;
for (int i = 1; i <= n;++i){
inp[i].x = std::lower_bound(c + 1, c + tot + 1, inp[i].x) - c;
inp[i].y = std::lower_bound(c + 1, c + tot + 1, inp[i].y) - c;
}
for (int i = 1; i <= MAXN;++i)
f[i] = i;
// std::sort(inp + 1, inp + tot + 1, cmp);
int flag = 1;
for (int i = 1; i <= n;++i){
int p = get_father(inp[i].x), q = get_father(inp[i].y);
if(inp[i].e==1&&p!=q)f[p] = q;
}
for (int i = 1; i <= n;++i){
int p = get_father(inp[i].x), q = get_father(inp[i].y);
if(inp[i].e==0&&p==q){
flag = 0;
puts("NO");
break;
}
}
if (flag) puts("YES");
}
return 0;
}

浙公网安备 33010602011771号