BZOJ 4195: [Noi2015]程序自动分析

Fancy posted @ 2015年8月03日 21:45 in BZOJ , 471 阅读

题目大意:给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,判定是否能使所有约束条件同时被满足。

 

先存起来,用并查集把相等的放在一起,然后判断所以不等的是否有矛盾。

重点在离散化,因为10^9当范围开不下,但实际数据只有最多2*10^5个,所以我用map整了一个离散化,因此跑得相当慢。。。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
int t,n,x,y,e;
int fat[200010],b[200010];
struct xxxx
  {int xx,yy,ee;}a[100010];
map <int,int> m;
int father(int x)
{
	if(fat[x]!=x) fat[x]=father(fat[x]);
	return fat[x];
}
int unionn(int x,int y)
{
	fat[father(x)]=father(y);
}
void f()
{
	memset(diren,0,sizeof(diren));
	for(int j=1;j<=b[0];j++) fat[j]=j;
	for(int j=1;j<=n;j++)
	  if(a[j].ee)
		unionn(m[a[j].xx],m[a[j].yy]);
	for(int j=1;j<=n;j++)
	  if(!a[j].ee)
		if(father(m[a[j].xx])==father(m[a[j].yy]))
		  {printf("NO\n");return;}
	printf("YES\n");
}
int main()
{
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		scanf("%d",&n);
		for(int j=1;j<=n;j++)
		{
		  	scanf("%d%d%d",&a[j].xx,&a[j].yy,&a[j].ee);
		  	b[++b[0]]=a[j].xx;b[++b[0]]=a[j].yy;
		}
		sort(b+1,b+2*n+1);
		b[0]=unique(b+1,b+2*n+1)-(b+1);
		for(int j=1;j<=b[0];j++)
		  m[b[j]]=j;
		f();
	}
	fclose(stdin);fclose(stdout);
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter