首页 > 其他 > 详细

【NOI2015】程序自动分析

时间:2019-08-29 00:55:43      阅读:58      评论:0      收藏:0      [点我收藏+]

题面

https://www.luogu.org/problem/P1955

题解

#include<cstdio>
#include<iostream>
#include<algorithm>
#define ri register int
using namespace std;
int f[200050];
int a[100050],b[100050],c[100050];
struct node {
  int x,id,s;
  bool operator < (const node &rhs) const {
    return x<rhs.x;
  }
} ll[200050];

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

int n,T;
int main(){
  scanf("%d",&T);
  while (T--) {
    scanf("%d",&n);
    for (ri i=1;i<=n;i++) {
      scanf("%d %d %d",&a[i],&b[i],&c[i]);
      ll[2*i-1]=(node){a[i],i,0};
      ll[2*i]=(node){b[i],i,1};
    }
    sort(ll+1,ll+2*n+1);
    int cnt=0;
    for (ri i=1;i<=2*n;i++) {
      if (ll[i].x!=ll[i-1].x) cnt++;
      if (ll[i].s==0) a[ll[i].id]=cnt; else b[ll[i].id]=cnt;
    }
    for (ri i=1;i<=cnt;i++) f[i]=i;
    for (ri i=1;i<=n;i++) if (c[i]==1) {
      int r1=findroot(a[i]),r2=findroot(b[i]);
      if (r1==r2) continue;
      f[r1]=r2;
    }
    int ans=1;
    for (ri i=1;i<=n;i++) if (c[i]==0) {
      int r1=findroot(a[i]),r2=findroot(b[i]);
      if (r1==r2) {ans=0;break;}
    }
    if (ans) puts("YES"); else puts("NO");
  }
}

 

【NOI2015】程序自动分析

原文:https://www.cnblogs.com/shxnb666/p/11427240.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!