P1955 [NOI2015]程序自动分析

题意

略(这东西应该都能看懂)

思路

先排序,把所有e=1的操作放在前面,然后再进行e=0的操作在进行e=1的操作的时候,我们只要把它约束的两个变量放在同一个集合里面即可。再e=0,即存在一条不相等的约束条件,对于它约束的两个变量,如果在一个集合里面,那就不可能满足!如不相等的约束条件都满足,那就YES。

显然并查集,但是因为数据范围到了 (1e9) 所以我们需要使用离散化(不开也行,也就是会MLE)

代码

#include<cstdio>
#include<iostream>
#include<algorithm> 
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#define int long long

using namespace std;

int t,n,f[1000007],book[1000007*3];

struct node{
	int x,y,e;
}a[1000001];
bool cmp(node a,node b){
	return a.e>b.e;
}

int find(int x){
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}

signed main(){
	scanf("%lld",&t);
	while(t--){
		int tot=-1;
		memset(book,0,sizeof(book));
		memset(a,0,sizeof(a));
		memset(f,0,sizeof(f));
		int flag=1;
		scanf("%lld",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%lld %lld %lld",&a[i].x,&a[i].y,&a[i].e);
			book[++tot]=a[i].x;
			book[++tot]=a[i].y;
		}
		sort(book,book+tot);//排序
		int reu=unique(book,book+tot)-book;//去重
		for(int i=1;i<=n;++i){
			a[i].x=lower_bound(book,book+reu,a[i].x)-book;
			a[i].y=lower_bound(book,book+reu,a[i].y)-book;
		}
		for(int i=1;i<=reu;i++) f[i]=i;//初始化
		sort(a+1,a+n+1,cmp);//按e排序
		for(int i=1;i<=n;i++){
			int r1=find(a[i].x);
			int r2=find(a[i].y);
			if(a[i].e){
				f[r1]=r2;
			}else if(r1==r2){
				printf("NO
");
				flag=0;
				break;
			}
		}
		if(flag) printf("YES
");
	}
	return 0;
}

[注意初始化 f[i]=i \ 没了 ]

原文地址:https://www.cnblogs.com/jasony/p/13339549.html