2441 角色属性树

2441 角色属性树

说一下,这道题是按着质数来的,但是似乎并没有用到质数,只是一个很简单的模拟(雾
看第一眼,以为是线段树or树状数组
看第二眼,以为是并查集
看第三眼,以为是LCA
(逃(逃(逃
一共分为两种操作,一个是查询父亲,一个是修改节点
修改节点没有什么技术含量,这里不再赘述
但是查询父亲就是一个模拟了,题目说

现在组员关心一个问题,希望知道离自己最近且有相同萌元素上司是谁

那么也就是说,判断祖宗辈和自己是否有公共的质因数,本来想着拆分质因数,然后进行比较,实际上,是否有公共的质因数,也就是是否有公共因数,就跑一边GCD判断了(感谢cfc同学的提醒),注意判断的两个对象是祖宗辈和自己,也就是不光包括父亲,还有爷爷曾爷爷一直到祖宗,所以我们用一个循环控制就好了,然后用一个小旗帜标记一下----虽然我的父亲不和我匹配,但是爷爷曾爷爷说不定可以呢

int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>arr[i];
	}
	for(int i=1;i<=n-1;i++)
	{
		cin>>x_i>>y_i;
		fa[y_i]=x_i;//父亲节点存储**编号** 
	}
	
	for(int i=1;i<=k;i++)
	{
		cin>>opt>>u_i;
		if(opt==1)
		{
			father=fa[u_i];
			while(arr[father]!=0)
			{
				if(gcd(arr[father],arr[u_i])==1)
					flag=0;
				else
				{
					cout<<father<<endl;
					flag=1;
					break;
				}	
				father=fa[father];
			}	
			if(flag==0||father==0)
			{
				cout<<"-1"<<endl;
				continue;
			}
				
		}
		else
		{cin>>a;arr[u_i]=a;}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值