題解 BZOJ 3910 火車

2022-03-16 14:16:32 字數 1051 閱讀 1617

#3910. 火車

給你一棵樹,給你乙個訪問節點的序列,按照先後順序去訪問序列中的從未經過過的節點,問經過了多少條邊。

並查集 $ + \ lca$。

用並查集維護每個點是否走過,如果走過了就將該點和他的第乙個沒被走過的父親合併。

\(lca\) 用來計算距離,在路徑上暴跳的時候維護並查集,因為每個點最多被經過一次,複雜度 \(o(n)\)。

#include #include #include #include #include #define maxn 500001

#define int long long

int n, m, s, pthn, head[maxn], fa_[maxn];

int lg[maxn], fa[maxn][21], dep[maxn];

struct edge pth[maxn << 1];

void add(int from, int to)

int find(int x)

void dfs(int u, int father)

}int lca(int x, int y)

if (x == y) return x;

for (int k = lg[dep[x]] - 1; k >= 0; --k)

} return fa[x][0];

}int dis(int x, int y, int l)

signed main()

dfs(1, 0);

for (int i = 1; i <= n; ++i)

for (int j = 1; (1 << j) <= n; ++j)

} int ans = 0;

for (int i = 1, t; i <= m; ++i)

while (dep[y] >= dep[l])

ans += dis(s, t, l);

s = t;

} }std::cout << ans << '\n';

return 0;

}

bzoj3910 火車 lca 並查集

a 國有n 個城市,城市之間有一些雙向道路相連,並且城市兩兩之間有唯一 路徑。現在有火車在城市 a,需要經過m 個城市。火車按照以下規則行駛 每次 行駛到還沒有經過的城市中在 m 個城市中最靠前的。現在小 a 想知道火車經過 這m 個城市後所經過的道路數量。第一行三個整數 n m a,表示城市數量 ...

3910 火車 LCA 並查集

在樹上走顯然是求lca,然後每次走完把端點到lca路徑上的點都用並查集合並,之後如果判斷兩點所屬集合相等說明已經走過。倍增被鏈剖虐成狗系列 include include define n 500005 define ll long long using namespace std int n,m,...

BZOJ P3910 火車 LCA 並查集

我也不知道為什麼要寫這篇題解 明明十分休閒 糾結了好幾分鐘要不要敘述一下題意 給定一棵樹以及乙個序列,按照序列的順序行走 從loc i loc i loc i 走到l oc i 1 loc i 1 loc i 1 但是如果對於某乙個loc loclo c 已經走到過就不需要再走了,問最後的行走距離 ...