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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值