该怎么卡?
查看原帖
该怎么卡?
480934
_LiMLE_楼主2021/10/21 23:50
#include<bits/stdc++.h>

using namespace std;

const int MAXN=1000001;

int Log[MAXN];
int f[MAXN][31];
int depth[MAXN];
int head[MAXN],pre[MAXN],ver[MAXN];
int cnt=1;

int n,m,s;

inline int read()
{
    char ch=getchar();
    int x=0;
    while(ch>'9'||ch<'0') ch=getchar();
    while(ch<='9'&&ch>='0')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x;
}

void add_edge(int u,int v)
{
    pre[cnt]=head[u];
    head[u]=cnt;
    ver[cnt]=v;
    cnt++;
}

void dfs(int st,int fno)
{
    depth[st]=depth[fno]+1;
    f[st][0]=fno;
    for(int i=1;i<=Log[n];i++) f[st][i]=f[f[st][i-1]][i-1];
    for(int i=head[st];i;i=pre[i])
    {
        if(ver[i]==fno) continue;
        dfs(ver[i],st);
    }
    return;
}

int lca(int x,int y)
{
    if(depth[x]>depth[y]) swap(x,y);
    int tmp=depth[y]-depth[x];
    for(int j=0;tmp;j++,tmp>>=1)
    {
        if(tmp&1) y=f[y][j];
    }
    if(x==y) return x;
    for(int i=Log[n];i>=0;i--)
    {
        if(f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
    }
    return f[x][0];
}

int main()
{
    n=read(),m=read(),s=read();
    for(int i=1;i<=n-1;i++)
    {
        int x,y;
        x=read(),y=read();
        add_edge(x,y);
        add_edge(y,x);
    }
    int rot=s;
    Log[1]=0,Log[2]=1;
    for(int i=3;i<=n;i++) Log[i]=Log[i/2]+1;
    dfs(rot,0);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        x=read(),y=read();
        cout<<lca(x,y)<<endl;
    }
    return 0;
}

这份代码十个点一共跑了5s

怎么卡下常,最慢的一个点985ms,我觉得我比较危

2021/10/21 23:50
加载中...