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;
}