将函数改成lambda内部函数后超时,希望有佬调一下
查看原帖
将函数改成lambda内部函数后超时,希望有佬调一下
819682
Exile_Code楼主2023/12/29 17:53
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <unordered_set>


#define ull				unsigned long long 
#define ll				long long
#define pii				pair<ll ,ll>
#define ft				first
#define sd				second
#define pr				pair
#define cy				cout<<"Yes"<<endl
#define cn				cout<<"No"<<endl
#define forn(i,n)		for(int (i)=0;(i)<(n);(i)++)   
#define forne(i,n)		for(int (i)=1;(i)<=(n);(i)++)
#define rforn(i,n)		for(int (i)=(n-1);(i)>=(0);(i)--)   
#define rforne(i,n)		for(int (i)=(n);(i)>=(1);(i)--)
#define vv				vector


const int inf = 0x004f4f4f;
const int N = 1e6 + 10;
int T;


void solve() {

	int n, m, s;
	vv<int>d;
	int f[N][30];
	vv<vv<int>>tree;
	cin >> n >> m >> s;
	tree.resize(n + 1, vv<int>());
	auto dfs = [&f,&tree,&d](auto&& dfs, int u, int fa)->void {

		d[u] = d[fa] + 1;
		f[u][0] = fa;

		for (int i = 1; i < 30; i++)
			f[u][i] = f[f[u][i - 1]][i - 1];

		for (auto a : tree[u])
			if (a != fa)
				dfs(dfs, a, u);

	};
	auto query = [&tree,&f,&d](int x, int y)->int {
		if (d[x] < d[y])swap(x, y);

		for (int i = 29; i >= 0; i--)
			if (d[f[x][i]] >= d[y])
				x = f[x][i];

		if (x == y)
			return y;

		for (int i = 29; i >= 0; i--) {
			if (f[x][i] != f[y][i])
				x = f[x][i], y = f[y][i];
		}
		return f[x][0];
	};
	forn(i, n - 1) {
		int a, b; cin >> a >> b;
		tree[a].push_back(b);
		tree[b].push_back(a);
	}
	d.resize(n + 1);

	d[s] = 0;
	d[0] = -1;
	dfs(dfs, s, 0);
	forn(i, m) {
		int a, b; cin >> a >> b;
		cout << query(a, b) << endl;
	}


}
int main() {

	T = 1;

	//cin >> T;
	while (T--)
		solve();

	return 0;
}

2023/12/29 17:53
加载中...