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); }