ST表求lca求调~(#10及以后全WA)
查看原帖
ST表求lca求调~(#10及以后全WA)
204989
_Iva楼主2022/10/10 11:47
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int rd()
{
	int x = 0, f = 0; char v = 0;
	while(!isdigit(v)) v = getchar(), f ^= v == '-' ;
	while(isdigit(v)) x = (x << 1) + (x << 3) + (v ^ 48), v = getchar();
	return f ? -x : x;
}

const int N = 5e5 + 10;
int hd[N], nxt[N << 1], to[N << 1], edtot;
inline void addedge(int u, int v) 
{
	nxt[++edtot] = hd[u];
	hd[u] = edtot;
	to[edtot] = v;
}
int n, qq, rt;
int dfn[N], sign, dep[N];
int mn[N << 1][19];
int Log[N << 1];
inline void dfs(int u, int f)
{
	dep[u] = dep[f] + 1;
	mn[++sign][0] = u;
	dfn[u] = sign;
	int v;
	for(int e = hd[u]; e; e = nxt[e]) if((v = to[e]) ^ f)
	{
		dfs(v, u);
		mn[++sign][0] = u;
	}
}
inline int LCA(int u, int v)
{
	int l = dfn[u], r = dfn[v];
	if(l > r) l ^= r ^= l ^= r; 
	int k = Log[r - l + 1];
	u = mn[l][k], v = mn[r - (1 << k) + 1][k];
	return dep[u] < dep[v] ? u : v;
}
int main()
{
	n = rd(), qq = rd(), rt = rd();
	for(int e = 1, u, v; e < n; ++e) 
		u = rd(), v = rd(), addedge(u, v), addedge(v, u);
	dfs(rt, 0);
	
	for(int i = 2; i <= sign; ++i) Log[i] = Log[i >> 1] + 1;
	for(int j = 1, u, v; j < 19; ++j)
	    for(int i = 1; (i + (1 << j) - 1) <= sign; ++i)
	    {
	    	if(dep[u = mn[i][j - 1]] < dep[v = mn[i + (1 << (j - 1))][j - 1]]) 
				mn[i][j] = u;
	    	else mn[i][j] = v;
		}
	
    for(int i = 1, u, v; i <= qq; ++i)
    {
    	u = rd(), v = rd();
    	cout << LCA(u, v) << '\n';
	}
	return 0;
}
2022/10/10 11:47
加载中...