MLE 0分求调
查看原帖
MLE 0分求调
812561
meimu75楼主2024/7/16 22:09

在别的地方时限1.5s空间限制256M跑的比洛谷慢还没开O2都能AC,到洛谷这儿全部MLE了。

#include <bits/stdc++.h>
using namespace std;
int n,m,s,p[500005],dep[500005],p1[500005][20];
vector<int> g[500005],t[500005];
void dfs(int x,int fa,int dp)
{
	dep[x] = dp;
	for(auto it:g[x])
	{
		if(it == fa)continue;
		p[it] = x;
		dfs(it,x,dp+1);
	}
}
void init()
{
	for(int i = 1;i <= n;i++)
	{
		p1[i][0] = p[i];
	}
	for(int t = 1;t <= 19;t++)
	{
		for(int i = 1;i <= n;i++)
		{
			p1[i][t] = p1[p1[i][t-1]][t-1];
		}
	}
}
int djzx(int x,int d)
{
	int pa = x,cnt = 0;
	while(d)
	{
		if(d & 1)pa = p1[pa][cnt];
		d >>= 1;
		cnt++;
	}
}
int lca(int a,int b)
{
	if(dep[a] < dep[b])swap(a,b);
	a = djzx(a,dep[a]-dep[b]);
	if(a == b)
	{
		return a;
	}
	int pos = 19,ans = 0;
	for(int i = 19;i >= 0;i--)
	{
		if(p1[a][i] != p1[b][i])
		{
			ans += 1<<i;
			a = p1[a][i];
			b = p1[b][i];
		}
	}
	a = p[a];
	return a;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> s;
	for(int i = 1;i < n;i++)
	{
		int x,y;
		cin >> x >> y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	dfs(s,0,1);
	init();
	while(m--)
	{
		int a,b;
		cin >> a >> b;
		cout << lca(a,b) << "\n";
	}
	return 0;
}
2024/7/16 22:09
加载中...