全WA,倍增LCA写炸了,求调
查看原帖
全WA,倍增LCA写炸了,求调
933906
WZwangchongming楼主2024/9/29 22:01
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <vector>
#include <queue>

using namespace std;

inline int read();
void write(int);
void writeln(int);

const int N = 500005;
int n, m, s, head[N], cnt, dep[N], dp[N][21];
bool vis[N];
struct node {
	int nxt, to;
} e[N * 2];

void add(int x, int y) {
	e[++cnt].to = y;
	e[cnt].nxt = head[x];
	head[x] = cnt;
}

void dfs(int x) {
	vis[x] = true;
	for(int i = head[x]; i; i = e[i].nxt) {
		if(!vis[e[i].to]) {
			dep[e[i].to] = dep[i] + 1;
			dp[e[i].to][0] = x;
			dfs(e[i].to);
		}
	}
}

void init() {
	for(int j = 1; j < 20; j++)
		for(int i = 1; i <= n; i++)
			dp[i][j] = dp[dp[i][j - 1]][j - 1];
}

int queryLCA(int x, int y) {
	if(dep[x] > dep[y]) swap(x, y);
	int d = dep[y] - dep[x];
	for(int i = 19; i >= 0; i--) if((d >> i) & 1) y = dp[y][i];
	if(x == y) return x;
	else {
		for(int i = 19; i >= 0; i--) 
			if(dp[x][i] != dp[y][i]) {
				x = dp[x][i];
				y = dp[y][i];
			}
		return dp[x][0];
	}
}
int main() {

//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);

	n = read();
	m = read();
	s = read();
	
	int M = n - 1;
	while(M--) {
		int x = read(), y = read();
		add(x, y);
		add(y, x);
	}
	
	dfs(s);
	init();
	
	for(int i = 1; i <= m; i++) {
		int x = read(), y = read();
		writeln(queryLCA(x, y));
	}
//	printf("\n");
//	cout<<"The time used: ";
//	printf("%.2lfs",(double)clock()/CLOCKS_PER_SEC);

	return 0;

}

inline int read() {
	int res = 0, f = 1;
	char ch = getchar();
	while( !(ch >= '0' && ch <= '9') ) {
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		res = (res << 1) + (res << 3) + (ch ^ 48);
		ch = getchar();
	}
	return res * f;
}

void write(int x) {
	static int sta[35];
	int top = 0;
	do {
		sta[top++] = x % 10;
		x /= 10;
	} while(x);
	while(top) putchar(sta[--top] ^ 48);
}

void writeln(int x) {
	write(x);
	putchar('\n');
}










2024/9/29 22:01
加载中...