1. 程式人生 > 其它 >洛谷 P2375 動物園

洛谷 P2375 動物園

該題是通過並查集維護著三個動物的關係 其中用距離d mod 3來維護
令距離為1的時候是.. 2的時候是被吃.. 3(或者說0)的時候是同種動物

注意當兩種動物不在同一個root上的時候 需要將他們合併/*並查集合並區間*/ 並且使其滿足輸入的特殊條件


#include <bits/stdc++.h>
#define ll long long

using namespace std;
const int N = 5E4 + 10;
int p[N], d[N];
int n,k;

int find(int x)
{
  if(x != p[x])
  {
    int t = find(p[x]);


    d[x] += d[p[x]];
    p[x] = t;
  }
   return p[x];
}

int main()
{
  cin>>n>>k;
  for(int i=1;i<=n;i++) p[i] = i;

  int sum = 0;
  while(k--)
  {
    int t,x,y;
    cin>>t>>x>>y;

  if(x > n || y > n)
  {
    sum++;
    continue;
  }
  else{
    if(t == 2 && x == y)


    {
      sum++;
      continue;
    }

  int px = find(x), py = find(y);
  if(t == 1)
  {
    if(px != py) //他倆不是一個根節點 他們是相互獨立的
  {
    p[px] = py;
    d[px] = d[y] - d[x];
  }
  else if(px == py && (d[y] - d[x]) % 3) sum++;
  }
    else if(t == 2)

  {
  if(px != py) //要將他倆合併 並且型別符合題目描述 所以+1
  {
    p[px] = py;
    d[px] = d[y] - d[x] + 1;
  }
    else if(px == py && (d[y] - d[x] + 1) % 3) sum++;
  }
    }
  }
    cout<<sum<<endl;
  }