1. 程式人生 > 其它 >st+dfs序求lca

st+dfs序求lca

st+dfs序求lca

ll dfn[N][2], id[N << 1], s, n, m, tot;
vector<ll> g[N];
void dfs(ll u, ll fa) {
    dfn[u][0] = dfn[u][1] = ++tot;
    id[tot] = u;
    for (auto to : g[u]) {
        if (to != fa) {
            dfs(to, u);
            dfn[u][1] = ++tot;
            id[tot] = u;
        }
    }
}

class ST { static ll lg[N]; ll n; function<ll(ll, ll)> cmp; vector<vector<ll>> table; public: ST(ll* arr, ll _n, function<ll(ll, ll)>_cmp = [](ll a, ll b) {return a < b ? a : b; }) : n(_n), cmp(_cmp) { if (!lg[0]) { lg[0] = -1
; rep(i, 1, N - 1) { lg[i] = lg[i / 2] + 1; } } table = vector<vector<ll>>(lg[n] + 1, vector<ll>(n + 1)); rep(i, 1, n) { table[0][i] = arr[i]; } rep(i, 1, lg[n]) { table[0][i] = arr[i];
for (ll j = 1;j + (1ll << i) - 1 <= n ; j++) { table[i][j] = cmp(table[i - 1][j], table[i - 1][j + (1<<(i-1))]); } } } ll qry(ll x, ll y) { ll t = lg[y - x + 1]; return cmp(table[t][x], table[t][y - (1ll << t) + 1]); } }; ll ST::lg[N];