等式

日照夏令营D1T3  等式

很简单的一道题,贪心,先处理对的,把它们放到一个并查集里,如果两个数父亲相同而读入的是0,就输出NO,否则YES。这里要离散化。

#include<bits/stdc++.h>
using namespace std;
void Cin(int &x)
{
    char c=getchar();x=0;
    while(c>'9'||c<'0')c=getchar();
    while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();
}
int n,k,T;
struct bcj
{
    int l,r,v;
    
    bool operator <(const bcj&a)const
    {
        return v>a.v;
    }
    
}e[100001];
int dad[100001];
int b[200011];

int getfather(int x)
{
    if(dad[x]==x)
    return x;
    dad[x]=getfather(dad[x]);
    return dad[x];
}

void bf()
{
    for(int i=1;i<=2*n;i++)
    dad[i]=i;
    for(int i=1;i<=n;i++)
    {
        if(getfather(e[i].l)!=getfather(e[i].r)&&e[i].v==1)
        {
            dad[getfather(e[i].l)]=e[i].r;
        }
        else
        if(getfather(e[i].l)==getfather(e[i].r))
        {
            if(e[i].v==0)
            {
            cout<<"NO"<<endl;
            return;
            }
        }
    }
    cout<<"YES"<<endl;
}

void init()
{
      Cin(n);
      for(int i=1;i<=n;i++)
      {
          Cin(e[i].l),Cin(e[i].r),Cin(e[i].v);
          b[i]=e[i].l;
          b[i+n]=e[i].r;
      }
      sort(e+1,e+n+1);
      sort(b+1,b+2*n+1);
      for(int i=1;i<=n;i++)
      {
          e[i].l=lower_bound(b+1,b+2*n+1,e[i].l)-b;
          e[i].r=lower_bound(b+1,b+2*n+1,e[i].r)-b;
      }
}

int main()
{
    freopen("equ.in","r",stdin);
    freopen("equ.out","w",stdout);
    
      Cin(T);
      while(T--)
      {
      init();
      bf();
      }
    return 0;
}
原文地址:https://www.cnblogs.com/war1111/p/7323436.html