BZOJ 4195 [Noi2015]程序自动分析

Posted zzyer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 4195 [Noi2015]程序自动分析相关的知识,希望对你有一定的参考价值。

题解:离散化+并查集

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2000009;

int T;
int n;
int a[maxn][3];
int b[maxn],nn;

int father[maxn];
int Getf(int x){
	if(father[x]==x)return x;
	return father[x]=Getf(father[x]);
}
void Unionn(int x,int y){
	int fx=Getf(x);
	int fy=Getf(y);
	if(father[fx]!=fy)father[fx]=fy;
}

int main(){
	scanf("%d",&T);
	while(T--){
		int fla=1;
		nn=0;
		scanf("%d",&n);
		for(int i=1;i<=n;++i){
			scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][0]);
			b[++nn]=a[i][1];b[++nn]=a[i][2];
		}
		sort(b+1,b+1+nn);
		nn=unique(b+1,b+1+nn)-b-1;
		for(int i=1;i<=n;++i){
			a[i][1]=lower_bound(b+1,b+1+nn,a[i][1])-b;
			a[i][2]=lower_bound(b+1,b+1+nn,a[i][2])-b;
		}
		for(int i=1;i<=nn;++i)father[i]=i;
		for(int i=1;i<=n;++i){
			if(a[i][0]==1)Unionn(a[i][1],a[i][2]);
		}
		for(int i=1;i<=n;++i){
			if(a[i][0]==0){
				if(Getf(a[i][1])==Getf(a[i][2]))fla=0;
			}
		}
		if(fla)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

  

以上是关于BZOJ 4195 [Noi2015]程序自动分析的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ4195] [NOI2015] 程序自动分析 (并查集)

bzoj4195[Noi2015]程序自动分析

BZOJ-4195: [Noi2015]程序自动分析 (并查集)

BZOJ 4195: [Noi2015]程序自动分析 [并查集 离散化 | 种类并查集WA]

BZOJ 4195 [Noi2015]程序自动分析

bzoj4195 [Noi2015]程序自动分析——并查集