题目链接
https://www.luogu.com.cn/problem/P2441
问题分析
- 要求与自己最近且有相同萌元素的上司,通过质因数分解,我们知道只要两个数 a a a, b b b的 gcd ( a , b ) \gcd(a,b) gcd(a,b) != 1即有共同的萌元素。
- 此题考虑暴力找“父亲”,用到了并查集。
- 挺水的一道题
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int a[maxn];
int fa[maxn];
int read()
{
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = x * 10 + (c - '0');
c = getchar();
}
return x * f;
}
int main()
{
int n, k;
n = read(), k = read();
for (int i = 1; i <= n; i++)
{
a[i] = read();
}
for (int i = 1; i <= n - 1; i++)
{
int x, y;
x = read();
y = read();
fa[y] = x;
}
while (k--)
{
int opr;
opr = read();
if (opr == 2)
{
int i, w;
i = read(), w = read();
a[i] = w;
}
else if (opr == 1)
{
int x;
x = read();
if (fa[x] == x)
{
puts("-1");
}
else
{
int z = x;
//z指向当前节点
bool flag = 0;
while (x != fa[x])
{
x = fa[x];
if (__gcd(a[x], a[z]) != 1)
{
flag = 1;
break;
}
}
if (flag && (x != 0))
{
printf("%d\n", x);
}
else
puts("-1");
}
}
}
return 0;
}