洛谷 P2375 動物園
阿新 • • 發佈:2021-12-02
該題是通過並查集維護著三個動物的關係 其中用距離d mod 3來維護
令距離為1的時候是.. 2的時候是被吃.. 3(或者說0)的時候是同種動物
注意當兩種動物不在同一個root上的時候 需要將他們合併/*並查集合並區間*/ 並且使其滿足輸入的特殊條件
#include <bits/stdc++.h>
#define ll long longusing 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;
}