在樹上走顯然是求lca,然後每次走完把端點到lca路徑上的點都用並查集合並,之後如果判斷兩點所屬集合相等說明已經走過。
《倍增被鏈剖虐成狗系列》
#include
#include
#define n 500005
#define ll long long
using namespace std;
int n,m,now,cnt;
ll ans;
int head[n],next[n<<1],list[n<<1],deep[n],f[n],fa[n][20];
inline int
read()
while (c>='0'&&c<='9')
return a*f;
}inline void insert(int
x,int
y)void dfs(intx)}
inline int lca(int
x,int
y)int find(int i)
int main()
dfs(1);
for (int i=1;i<=m;i++)
x=next;
while (find(x)!=h)
now=next;
}cout << ans << endl;
return
0;}
bzoj3910 火車 lca 並查集
a 國有n 個城市,城市之間有一些雙向道路相連,並且城市兩兩之間有唯一 路徑。現在有火車在城市 a,需要經過m 個城市。火車按照以下規則行駛 每次 行駛到還沒有經過的城市中在 m 個城市中最靠前的。現在小 a 想知道火車經過 這m 個城市後所經過的道路數量。第一行三個整數 n m a,表示城市數量 ...
BZOJ P3910 火車 LCA 並查集
我也不知道為什麼要寫這篇題解 明明十分休閒 糾結了好幾分鐘要不要敘述一下題意 給定一棵樹以及乙個序列,按照序列的順序行走 從loc i loc i loc i 走到l oc i 1 loc i 1 loc i 1 但是如果對於某乙個loc loclo c 已經走到過就不需要再走了,問最後的行走距離 ...
LCA法寶 並查集
由於我也是看懂的,突然發現這篇部落格特別的好!lca 最近公共祖先 我相信你現在肯定自己就可以打 了!另外注意,這裡的 f 陣列其實是用了並查集的思想 並查集詳解 倍增 inline void dfs int x,int s,int chang for reg int i 0 i g x size ...