NOI2015 程序自動分析(luogu p1955)
阿新 • • 發佈:2017-09-20
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)