1. 程式人生 > >NOI2015 程序自動分析(luogu p1955)

NOI2015 程序自動分析(luogu p1955)

tro 滿足 並查集 con name font http -s esp

原題鏈接:https://www.luogu.org/problem/show?pid=1955

夏令營的模擬考試題,今天才發現是NOI原題,沒想到15年也有這樣裸的題。。。

離散化一下,這樣就能用並查集來處理問題,然後逐個判斷,相等的就將其合並,不相等就判斷是否真的不相等,如果已知兩數相等,那麽就能確定不可被滿足。

除了離散化有點玄學之外,其他的倒是挺正常的並查集。。。

#include<cstdio>
#include<algorithm>
using namespace std;
int u[100005],v[100005],e[100005],f[200005],n,tmp[200005],t;
int find(int x) { if(x==f[x]) return x; return f[x]=find(f[x]); } void solve() { scanf("%d",&n); for(int i=1;i<=n*2;++i) f[i]=i; for(int i=1;i<=n;++i) { scanf("%d%d%d",&u[i],&v[i],&e[i]); tmp[i*2-1]=u[i],tmp[i*2]=v[i]; } sort(tmp+1
,tmp+1+n*2); for(int i=1;i<=n;++i) { u[i]=lower_bound(tmp+1,tmp+1+n*2,u[i])-tmp; v[i]=lower_bound(tmp+1,tmp+1+n*2,v[i])-tmp; if(e[i]&&find(u[i])!=find(v[i])) f[find(u[i])]=v[i]; } for(int i=1;i<=n;++i) { if(e[i]) continue; if(find(u[i])==find(v[i])) { printf(
"NO\n"); return; } } printf("YES\n"); } int main() { scanf("%d", &t); while(t--) solve(); return 0; }

NOI2015 程序自動分析(luogu p1955)