1 条题解

  • 0
    @ 2025-10-10 13:40:54

    数据随机说明平均数高为 log(n)\log(n),所以树高可得出约等于17。

    如此鲜美的数据尽然可以直接暴力过,对于每个询问把询问节点一层一层往父跳,如满足要求直接返回答案。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N=200009;
    int a[N],fa[N];
    int n,k,x,y,opt;
    int gcd(int x,int y){
    	if(y==0) return x;
    	return gcd(y,x%y);
    }
    int solve(int x){
    	int now=fa[x];
    	while(now!=0){
    		if(gcd(a[x],a[now])>1) return now;
    		now=fa[now];
    	}
    	return -1;
    }
    int main(){
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    	for(int i=1;i<n;i++){
    		scanf("%d%d",&x,&y);
    		fa[y]=x;
    	}
    	while(k--)
    	{
    		scanf("%d",&opt);
    		if(opt==1){
    			scanf("%d",&x);
    			printf("%d\n",solve(x));
    		}
    		else{
    			scanf("%d%d",&x,&y);
    			a[x]=y;
    		}
    	}
    	return 0;
    }
    

    信息

    ID
    6479
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    3
    已通过
    2
    上传者