Noi2015 프로그램 자동 처리

1773 단어
뚜렷한 병집 을 찾 았 지만 손 찌꺼기 e 와 q 를 많이 잘못 쳤 지만 매번 제출 은 50 = = 을 데이터 너무 물 인가?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<bitset>
#define LL long long
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define down(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline LL read()
{
	LL d=0,f=1;char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
	while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
	return d*f;
}
#define N 1000005
int f[N*2];
int a[N*4];
struct edge
{
	int x,y;
}e[N*2];
int ne;
struct qedge
{
	int x,y;
}q[N*2];
int qn;
int n;

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

inline int erfen(int l,int r,int x) 
{
    int mid=(l+r)>>1;
    while(l<r) 
	{
        if (a[mid]==x) return mid;
        if (a[mid]<x)l=mid+1;
        else r=mid-1;
        mid=(l+r)>>1;
    }
    return mid;
}

int main()
{
	int t=read();
	while(t--)
	{
		n=read();ne=0;qn=0;int cnt=0;
//		fo(i,1,n)f[i]=i;
		fo(i,1,n)
		{
			int x=read(),y=read(),ee=read();
			if(ee){e[++ne].x=x;e[ne].y=y;}
			else{q[++qn].x=x;q[qn].y=y;}
			a[++cnt]=x;a[++cnt]=y;
		}
		sort(a+1,a+cnt+1);
		int len=unique(a+1,a+cnt+1)-(a+1);
		fo(i,1,len)f[i]=i;
		fo(i,1,ne)
		{
			int t1=erfen(1,len,e[i].x);
			int t2=erfen(1,len,e[i].y);
			if(find(t1)!=find(t2))
			f[find(t1)]=find(t2);
		}
		int flag=1;
		fo(i,1,qn)
		{
			int t1=erfen(1,len,q[i].x);
			int t2=erfen(1,len,q[i].y);
			if(find(t1)==find(t2))
			{
				flag=0;
				break;
			}
		}
		if(flag)printf("YES
"); else printf("NO
"); } return 0; }

좋은 웹페이지 즐겨찾기