Luogu p2441 角色属性树

题目链接

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;
}
上一篇:linux – 编写脚本以使用预定义的密码创建多个用户


下一篇:c# – 无需通过电子邮件发送密码即可恢复密码