【悬关】30pts求助
查看原帖
【悬关】30pts求助
1271532
Alice2012楼主2024/5/13 15:56

RT

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,q;
int a[N],dep[N],dis2[N],dis5[N];
int dp[N][30];
struct node{
	int y,z;
};
vector<node>v[N];
int Cal(int x,int num){
	int cnt=0;
	while(x&&x%num==0){
		x/=num;
		cnt++;
	}
	return cnt;
}
void DFS(int x,int fa){
	dep[x]=dep[fa]+1;
	dp[x][0]=fa;
	for(int i=1;(1<<i)<=dep[x];i++)
		dp[x][i]=dp[dp[x][i-1]][i-1];
	for(int i=0;i<v[x].size();i++){
		int to=v[x][i].y,w=v[x][i].z;
		if(to==fa)
			continue;
		if(w==0)
			dis2[to]=dis5[to]=1e9;
		else{
			dis2[to]=dis2[x]+Cal(w,2)-4;
			dis5[to]=dis5[x]+Cal(w,5)-4;
		}
		DFS(to,x);
	}
	return;
}
int LCA(int x,int y){
	if(dep[x]>dep[y])
		swap(x,y);
	for(int i=20;i>=0;i--)
		if(dep[x]<=dep[dp[y][i]])
			y=dp[y][i];
	if(x==y)
		return x;
	for(int i=20;i>=0;i--)
		if(dp[x][i]!=dp[y][i])
			x=dp[x][i],y=dp[y][i];
	return dp[x][0];
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<n;i++){
		int x,y;
		double z;
		cin>>x>>y>>z;
		z*=10000;
		v[x].push_back({y,z});
		v[y].push_back({x,z});
	}
	DFS(1,0);
	while(q--){
		int x,y;
		cin>>x>>y;
		int num2=dis2[x]+dis2[y]-2*dis2[LCA(x,y)]+Cal(a[x],2);
		int num5=dis5[x]+dis5[y]-2*dis5[LCA(x,y)]+Cal(a[x],5);
		if(min(num2,num5)>=0||!a[x])
			cout<<"Yes\n";
		else
			cout<<"No\n";
	}
	return 0;
}
2024/5/13 15:56
加载中...