HDU7275求助
  • 板块学术版
  • 楼主___A__
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/3 20:47
  • 上次更新2024/7/3 22:45:52
查看原帖
HDU7275求助
275860
___A__楼主2024/7/3 20:47
#include<bits/stdc++.h>
using namespace std;
const int N=3e3+5,bit=20;
vector<int>g[N];
int n,T,m,f[N][20],dep[N],vis[N],pos1[N],pos2[N];
void dfs(int u){
    for(int v:g[u]){
        if(v!=f[u][0]){
            f[v][0]=u,dep[v]=dep[u]+1;
            for(int i=1;i<bit;i++){
                f[v][i]=f[f[v][i-1]][i-1];
            }
            dfs(v);
        }
    }
}
int lca(int u,int v){
    if(dep[u]<dep[v]){
        swap(u,v);
    }
    int num=dep[u]-dep[v];
    for(int i=0;i<bit;i++){
        if(num>>i&1){
            u=f[u][i];
        }
    }
    if(u==v){
        return u;
    }
    for(int i=bit-1;i>=0;i--){
        if(f[u][i]!=f[v][i]){
            u=f[u][i],v=f[v][i];
        }
    }
    return f[u][0];
}
pair<int,int>exgcd(int a,int b){
    if(!b){
        return {1,0};
    }
    auto [x,y]=exgcd(b,a%b);
    return {y,x-a/b*y};
}
int lcm(int x,int y){
    return x/__gcd(x,y)*y;
}
int crt(int b1,int a1,int b2,int a2){
    int d=__gcd(b1,-b2);
    if((a2-a1)%d){
        return -1;
    }
    int p1=b1/d,p2=b2/d,c=(a2-a1)/d;
    auto [x,y]=exgcd(p1,-p2);
    x*=c,y*=c,x%=lcm(b1,b2);
    a1=(b1*x+a1)%lcm(b1,b2),b1=lcm(b1,b2);
    return (a1%b1+b1)%b1;
}
vector<int>route(int u,int v){
    int num=lca(u,v);
    vector<int>ret;
    while(u!=num){
        ret.push_back(u),u=f[u][0];
    }
    ret.push_back(num);
    vector<int>tmp;
    while(v!=num){
        tmp.push_back(v),v=f[v][0];
    }
    reverse(tmp.begin(),tmp.end());
    for(int i:tmp){
        ret.push_back(i);
    }
    return ret;
}
void init(){
    for(int i=1;i<=n;i++){
        g[i].clear();
    }
}
vector<int>db(vector<int>A){
    vector<int>B=A;
    B.pop_back();
    reverse(B.begin(),B.end());
    for(int i:B){
        A.push_back(i);
    }
    return A;
}
signed main(){
    cin>>T;
    while(T--){
        cin>>n>>m,init();
        for(int i=1,u,v;i<n;i++){
            cin>>u>>v,g[u].push_back(v),g[v].push_back(u);
        }
        dfs(1);
        for(int sa,ta,sb,tb;m--;){
            cin>>sa>>ta>>sb>>tb;
            int id=0;
            vector<int>A=route(sa,ta),B=route(sb,tb);
            A=db(A),B=db(B);
            for(int i:B){
                if(!vis[i]){
                    vis[i]=1,pos1[i]=id;
                }
                else{
                    pos2[i]=id;
                }
                id++;
            }
            id=0;
            int ans=1e9,num=0;
            for(int i:A){
                if(vis[i]){
                    int x=crt(A.size(),id,B.size(),pos1[i]);
                    if(x!=-1){
                        if(ans>x){
                            ans=x,num=i;
                        }
                    }
                    x=crt(A.size(),id,B.size(),pos2[i]);
                    if(x!=-1){
                        if(ans>x){
                            ans=x,num=i;
                        }
                    }
                }
                id++;
            }
            for(int i:B){
                vis[i]=0;
            }
            if(ans==1e9){
                cout<<"-1\n";
            }
            else{
                cout<<num<<'\n';
            }
        }
    }
  }
2024/7/3 20:47
加载中...