倍增subtask1 T掉,0 WA掉,30分求调
查看原帖
倍增subtask1 T掉,0 WA掉,30分求调
735696
Mcqueen1210楼主2024/10/21 19:10

如题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M=500005;
inline ll read()
{
	ll s=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') w=-1;c=getchar();}
	while(c>='0'&&c<='9') s=s*10+(c-'0'),c=getchar();
	return s*w;
}
inline void out(ll x)
{
	if(x==0){putchar('0');return;}
	ll k=x,len=0,c[10005];
	if(k<0) putchar('-'),k=-k;
	while(k) c[len++]=k%10+'0',k/=10;
	while(len--) putchar(c[len]);
}
ll n,m,s,f[M][25],dep[M],Log[M];
ll head[M],cnt;
struct wide
{
    int v,next;
} a[M<<1];
void dfs(int u,int fa)
{
    f[u][0]=fa;
    dep[u]=dep[fa]+1;
    for(int i=1; i<=Log[dep[u]]; i++)
    {
        ll pos=f[u][i-1];
        f[u][i]=f[pos][i-1];
    }
    for(int i=head[u]; i>0; i=a[i].next)
    {
        ll x=a[i].v;
        if(x!=fa)
        {
            dfs(x,u);
        }
    }
}
void init()
{
    for(int i=1; i<=n; i++)
    {
        Log[i]=Log[i-1]+(1<<Log[i]==i);
    }
    dfs(s,0);
}
ll LCA(int x,int y)
{
    if(dep[x]<dep[y])
    {
        swap(x,y);
    }
    while(dep[x]>dep[y])
    {
        int pos=Log[dep[x]-dep[y]]-1;
        x=f[x][pos];
    }
    if(x==y) return x;
    for(int k=Log[dep[x]]-1; k>=0; k--)
    {
        if(f[x][k]!=f[y][k])
        {
            x=f[x][k],y=f[y][k];
        }
    }
    return f[x][0];
}
void add(int x,int y)
{
    cnt++;
    a[cnt].v=y,a[cnt].next=head[x];
    head[x]=cnt;
}
int main()
{
    n=read(),m=read(),s=read();
    for(int i=1; i<n; i++)
    {
        ll x,y;
        x=read(),y=read();
        add(x,y);
        add(y,x);
    }
    init();
    while(m--)
    {
        ll x,y;
        x=read(),y=read();
        out(LCA(x,y));
        puts("");
    }
    return 0;
}
2024/10/21 19:10
加载中...