只有 #5 过了,其他的点都超时了,样例也能过
是不是常数有点大?
#include<bits/stdc++.h>
#define f first
#define g second
using namespace std;
typedef pair<int,int> PII;
const int N=3e5,M=4e5;
PII a[N],val[M],dis[M];
int depth[N],fa[N][18];
int n,q,tot,head[N],to[M],nxt[M];
void add(int x,int y,PII z) {
to[tot]=y,val[tot]=z;
nxt[tot]=head[x];
head[x]=tot++;
}
void dfs(int u,int father)
{
fa[u][0]=father;
depth[u]=depth[father]+1;
for (int i=1;i<18;i++)
fa[u][i]=fa[fa[u][i-1]][i-1];
for (int i=head[u];~i;i=nxt[i])
{
int v=to[i]; PII x=val[i];
if (v!=father) {
dis[v].f=dis[u].f+x.f;
dis[v].g=dis[u].g+x.g;
dfs(v,u);
}
}
}
int LCA(int x,int y)
{
if (depth[x]<depth[y]) swap(x,y);
for (int i=17;i>=0;i--)
if (depth[fa[x][i]]>=depth[y])
x=fa[x][i];
if (x==y) return x;
for (int i=17;i>=0;i--)
if (fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int main()
{
scanf("%d%d",&n,&q);
memset(head,-1,sizeof head);
for (int i=1,x;i<=n;i++) {
scanf("%d",&x);
while (!(x&1)) x>>=1,a[i].f++;
while (!(x%5)) x/=5,a[i].g++;
}
for (int i=1;i<n;i++) {
int x,y,z; double t; PII v;
scanf("%d%d%lf",&x,&y,&t);
z=t*1e4,v.f=v.g=-4;
while (!(z&1)) z>>=1,v.f++;
while (!(z%5)) z/=5,v.g++;
add(x,y,v),add(y,x,v);
}
dfs(1,0);
while (q--) {
int x,y,z; PII v;
scanf("%d%d",&x,&y);
z=LCA(x,y);
v.f=dis[x].f+dis[y].f-(dis[z].f<<1)+a[x].f;
v.g=dis[x].g+dis[y].g-(dis[z].g<<1)+a[x].g;
puts(v.f>=0&&v.g>=0?"Yes":"No");
}
return 0;
}