萌新初学OI,求助LCA,88分超时。
查看原帖
萌新初学OI,求助LCA,88分超时。
143530
LiteratureCollege楼主2022/8/30 14:21

代码如下,卡不过去

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int in()
{
	int f=1,s=0;
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while(c<='9'&&c>='0')
	{
		s=s*10+c-'0';
		c=getchar();
	}
	return s*f;
}
inline void out(int x)
{
	char ch[11];
	int t=0;
	while(x)
	{
		ch[++t]=x%10+'0';
		x/=10;
	}
	for(int i=t;i>=1;i--)putchar(ch[i]);
}

const int N=1000620;
const int M=2000620;

int n,m,k,now,cnt,u,v;
int e,head[N],nxt[M],to[M];
int deep[N],fath[N][21];

inline void add(int x,int y)
{
	e++;
	to[e]=y;
	nxt[e]=head[x];
	head[x]=e;
}
void dfs(int now,int fa)
{
	deep[now]=deep[fa]+1;
	fath[now][0]=fa;
	for(int k=1;(1<<k)<=deep[now];k++)
	{
		fath[now][k]=fath[fath[now][k-1]][k-1];
	}
	for(int i=head[now];i;i=nxt[i])
	{
		v=to[i];
		if(v==fa)continue;
		dfs(v,now);
	}
}
int lca(int x,int y)
{
	if(deep[x]>deep[y])
	{
		swap(x,y);
	}
	for(int k=20;k>=0;k--)
	{
		if(deep[x]<=deep[fath[y][k]])
		{
			y=fath[y][k];
		}
	}
	if(x==y)
	{
		return x;
	}
	for(int k=20;k>=0;k--)
	{
		if(fath[x][k]!=fath[y][k])
		{
			x=fath[x][k];
			y=fath[y][k];
		}
	}
	return fath[x][0];
}
int find(int now,int sum)
{
	int s=0;
	for(int k=20;k>=0;k--)
	{
		if(s+deep[now]-deep[fath[now][k]]<=sum)
		{
			s+=deep[now]-deep[fath[now][k]];
			now=fath[now][k];
		}
	}
	return now;
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<n;i++)
	{
		u=in();v=in();
		add(u,v);
		add(v,u); 
	}
	dfs(m,0);
	now=m;
	while(k--)
	{
		u=in();
		v=in();
		cnt=lca(u,now);
		if((deep[now]-deep[cnt])+(deep[u]-deep[cnt])<=v)
		{
			out(u);
			putchar(' ');
			now=u;
		}
		else
		{
			if(deep[now]-deep[cnt]>v)
			{
				now=find(now,v);
				out(now);
				putchar(' ');
			}
			else
			{
				v=(deep[now]-deep[cnt])+(deep[u]-deep[cnt])-v;
				now=find(u,v);
				out(now);
				putchar(' ');
			}
		}
	}
	return 0;
}
2022/8/30 14:21
加载中...