奇妙的并查集方法
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define tp(i,j,k,l) for(int i=j;i<=k;i+=l)
#define pt(i,j,k,l) for(int i=j;i>=k;i-=l)
#define ls u<<1
#define rs u<<1|1
const int N=200010;
int n,m;
int f[N*4];
int find(int x)
{
if(x!=f[x]) f[x]=find(f[x]);
return f[x];
}
void solve()
{
int ver1=N,ver2=N*2;
for(int i=1;i<N;i++)
{
f[i]=i;
f[ver1+i]=i;
f[ver2+i]=i;
}
cin>>n>>m;
int ans=0;
map<int,int> mp;
while(m--)
{
int a,c;
char b,d;
cin>>a>>b>>c>>d;
if(b=='B'&&d=='B')
{
if(find(a+ver1)==find(c+ver1))
{
ans++;
mp[find(a+ver1)]=1;
}
f[find(a+ver1)]=find(c+ver1);
}
if(b=='B'&&d=='R')
{
if(find(a+ver1)==find(c+ver2))
{
ans++;
mp[find(a+ver1)]=1;
}
f[find(a+ver1)]=find(c+ver2);
}
if(b=='R'&&d=='B')
{
if(find(a+ver2)==find(c+ver1))
{
ans++;
mp[find(a+ver1)]=1;
}
f[find(a+ver2)]=find(c+ver1);
}
if(b=='R'&&d=='R')
{
if(find(a+ver2)==find(c+ver2))
{
ans++;
mp[find(a+ver1)]=1;
}
f[find(a+ver2)]=find(c+ver2);
}
}
int fans=0;
for(int i=1;i<=n;i++)
if(f[i]==i&&!mp[i]) fans++;
cout<<ans<<" "<<fans;
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
cout.tie(0)->sync_with_stdio(0);
int t=1;
//cin>>t;
while(t--) solve();
return 0;
}