タイトルは、
タイトルは\(LCT \)裸のタイトルが、正の解のタイトルはLCTあり、そして暴力互いに素-セットは、この問題を解決することができます。
問題は必要としないでもパス圧縮ができるように、この問題は、中央のパス踏み台の量を必要としているので。
まずは、接続して破壊する操作を考えてみましょう。
\(接続\)操作:
。Uので、V意志も全体として、FAはそう[U] = FA [V]
\(破壊\)操作:
Uので、vは全体に接続されない、[FAので。V] = 0、すなわち、元の状態に正規化。
\(クエリー\)操作:
操作UまたはV親ノードをスキップし、uは= V内のノードによって取得することができ、またはノードホップの一つまで0
この時、UまたはVは、それらが等しいかどうか判断される。それらは、次いで上側の鎖等しい場合。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define int long long
#define N 4011
using namespace std;
int n, m, fa[401100];
inline int query(int u, int v)
{
while (v && u != v)
{
v = fa[v];
if (v == u)
return 1;
}
if (u == 0) return 1;
if (v == u) return 1;
return 0;
}
inline void connect(int u, int v)
{
fa[u] = v;
}
inline void destroy(int u, int v)
{
fa[v] = 0;
}
signed main()
{
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= m; i++)
{
string s; int u, v, temp = 0, u1, ha;
cin >> s;
scanf("%lld%lld", &u, &v);
u1 = u;
while (u1)
{
ha = fa[u1];
fa[u1] = temp; temp = u1; u1 = ha;
}
if (s == "Connect")
connect(u, v);
if (s == "Destroy")
destroy(u, v);
if (s == "Query")
{
if (query(u, v))
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}