UB 求助(?)
  • 板块学术版
  • 楼主lnwhl
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/9/9 21:37
  • 上次更新2023/10/27 12:11:15
查看原帖
UB 求助(?)
451328
lnwhl楼主2022/9/9 21:37

对于这道题,我写了如下代码,本地运行没问题,洛谷上不开 O2 可以正常运行,开了 O2 就 RE 了。

交到了 AtCoder 上全 RE 了,请问这是什么 UB?

测评链接

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,st,ed,dis[N],depst[N],deped[N],fst[N][20],fed[N][20];
vector<int>g[N];
inline int fw(int u,int fa)
{
	for(int i=0;i<g[u].size();++i)
	{
		int v=g[u][i];if(v==fa)continue;
		dis[v]=dis[u]+1;fw(v,u);
	}
}
inline void dfs(int u,int fa,int type)
{
	if(type==1)
	{
		fst[u][0]=fa;
		for(int i=1;i<=18;++i)
			fst[u][i]=fst[fst[u][i-1]][i-1];
	}
	else 
	{
		fed[u][0]=fa;
		for(int i=1;i<=18;++i)
			fed[u][i]=fed[fed[u][i-1]][i-1];
	}
	for(int i=0;i<g[u].size();++i)
	{
		int v=g[u][i];if(v==fa)continue;
		if(type==1)depst[v]=depst[u]+1;
		else deped[v]=deped[u]+1;
		dfs(v,u,type);
	}
}
signed main()
{
	cin>>n;
	for(int i=1;i<n;++i)
	{
		int u,v;cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	fw(1,1);
	int dmax;
	for(int i=1;i<=n;++i)
		if(dis[i]>dmax)dmax=dis[i],st=i;
	memset(dis,0,sizeof(dis));fw(st,st);
	dmax=0;
	for(int i=1;i<=n;++i)
		if(dis[i]>dmax)dmax=dis[i],ed=i;
	dfs(st,st,1);dfs(ed,ed,2);
	cin>>q;
	while(q--)
	{
		int u,k;cin>>u>>k;
		if(depst[u]<k&&deped[u]<k)cout<<-1<<endl;
		else if(depst[u]>=k)
			{
				for(int i=18;i>=0;--i)
					if(k>=(1<<i))k-=(1<<i),u=fst[u][i];
				cout<<u<<endl;	
			} 
			else
			{
				for(int i=18;i>=0;--i)
					if(k>=(i<<i))k-=(1<<i),u=fed[u][i];
				cout<<u<<endl;
			}
	}
	return 0;
}
2022/9/9 21:37
加载中...