求调
查看原帖
求调
964822
protractor半圆仪楼主2024/11/13 15:58
#include<bits/stdc++.h>
using namespace std;
int fa[200050][32];
int de[200050];
vector<pair<int,pair<long long,long long> > > v[200050];
double d;
int n,q,x,y;
pair<long long,long long> a[200050];
pair<long long,long long> f[200050];
pair<long long,long long> pl(pair<long long,long long> x,pair<long long,long long> y)
{
    return make_pair(x.first+y.first,x.second+y.second);
}
pair<long long,long long> mi(pair<long long,long long> x,pair<long long,long long> y)
{
    return make_pair(x.first-y.first,x.second-y.second);
}
pair<long long,long long> fun(double x)
{
    if(x==0) return make_pair(1000000,1000000);
    long long a=0,b=0;
    while(x!=int(x))
    {
        x*=10;
        a--,b--;
    }
    int y=x;
    while(y%2==0)
    {
        y/=2;
        a++;
    }
    while(y%5==0)
    {
        y/=5;
        b++;
    }
    return make_pair(a,b);
}
void dfs(int x)
{
    int p=0;
    while(fa[x][p])
    {
        fa[x][p+1]=fa[fa[x][p]][p];
        p++;
    }
    for(auto yy : v[x])
    {
        int y=yy.first;
        if(y==fa[x][0]) continue;
        fa[y][0]=x;
        de[y]=de[x]+1;
        f[y]=pl(f[x],yy.second);
        dfs(y);
    }
}
int lca(int x,int y)
{
    if(de[y]>de[x])
    {
        x+=y;
        y=x-y;
        x-=y;
    }
    for(int i=31;i>=0;i--)
    {
        if(de[fa[x][i]]>=de[y]) x=fa[x][i];
    }
    if(x==y) return x;
    for(int i=31;i>=0;i--)
    {
        if(fa[x][i]-fa[y][i])
        {
            x=fa[x][i];
            y=fa[y][i];
        }
    }
    return fa[x][0];
}
bool check(pair<long long,long long> x)
{
    return ((x.first>=0&&x.second>=0)?1:0);
}
int main()
{
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>d;
        a[i]=fun(d);
    }
    for(int i=1;i<n;i++)
    {
        cin>>x>>y>>d;
        pair<long long,long long> z=fun(d);
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }
    de[1]=1;
    dfs(1);
    for(int i=1;i<=q;i++)
    {
        cin>>x>>y;
        int z=lca(x,y);
        if(check(pl(a[x],pl(mi(f[x],f[z]),mi(f[y],f[z]))))) cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}

TLE 25pts求调,谢谢大佬们

2024/11/13 15:58
加载中...