我的代码被降维打击导致80分!求条!
查看原帖
我的代码被降维打击导致80分!求条!
1352022
__Digger__楼主2024/9/10 20:11

rt,LCA。

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int MAXN = 1e5 + 1;
long long n, m, a, b, root,num[3];
map<int, map<int, int>> st;
map<int, int> deep;
map<int, vector<int>> c;
void dfs(int x, int step) {
	deep[x] = step;
	for(int i = 0; i < c[x].size(); i++) {
		if(deep[c[x][i]] == 0) {
			dfs(c[x][i], step + 1);
			st[c[x][i]][0] = x;
		}
	}
}
int LCA(int x, int y) {
	if(deep[x] > deep[y]) {
		swap(x, y);
	}
	for(int i = 21; i >= 0; i--) {
		if(deep[st[y][i]] >= deep[x]) {
			y = st[y][i];
		}
	}
	if(x == y) {
		return x;
	}
	for(int i = 21; i >= 0; i--) {
		if(st[x][i] != st[y][i]) {
			x = st[x][i], y = st[y][i];
		}
	}
	return st[x][0];
}

signed main() {
//    freopen("tree.in", "r", stdin);
//    freopen("tree.out", "w", stdout);
    cin >> a >> b;
    c[a + b].push_back(a);
    c[a + b].push_back(b);
    num[0] = a;
    num[1] = b;
    num[2] = a + b;
	dfs(a + b, 1);
	for(int i = 1; i <= 21; i++) {
		for(int j = 0; j < 3; j++) {
			st[num[j]][i] = st[st[num[j]][i - 1]][i - 1];
		}
	}
	cout << LCA(a, b);
    return 0;
}
2024/9/10 20:11
加载中...