好久沒更新了,就更一篇普及組內容好了。
首先我們考慮如何用tarjan離線求出lca,偽**大致如下:
deftarjan(x):
將x標記為已訪問
for c in
x的孩子:
tarjan(c)
將c所在並查集的父親置為x
for q in
關於x的詢問:
y=詢問q除了x外的另乙個端點
ify已訪問:
q的答案=y所在並查集的根
這樣為什麼是對的呢?考慮lca肯定是先搜到y,再搜到x,因為此時lca還沒有做完,所以此時並查集的根就是lca,而且y已經和lca並在一起了,所以會詢問到正確的結果。
現在我們要用tarjan來解決路徑詢問問題,例如每條邊有邊權,若干次詢問,詢問路徑上的邊權和。
首先我們要在並查集上動一些手腳,原來並查集只是用來查詢祖先,我們在並查集每個點上記乙個額外資訊,為這個點到並查集根的資訊,在本題中即為該點到根的邊權和。在查詢祖先時我們可以順便更新這個資訊。
查出lca時我們把這個詢問扔進lca,把它稱作「延遲詢問」,回到lca的時候遍歷所有延遲詢問,這時候x和y在並查集中的祖先都是lca,直接合併資訊即可。
ff=乙個初始為0的陣列儲存並查集info=乙個初始為空的陣列儲存資訊
deffind(x):
if!ff[x]:
return
x y=ff[x]
ff[x]=find(y)
info[x]=info[x]+info[y]
return
ff[x]
deftarjan2(x):
將x標記為已訪問
for c in
x的孩子:
tarjan2(c)
ff[c]=x
info[c]=c到x的邊的資訊
for q in
關於x的詢問:
y=詢問q除了x外的另乙個端點
ify已訪問:
q的lca=y所在並查集的根
在q的lca處插入延遲詢問q
for q in
x為lca的延遲詢問:
(a,b)=該詢問的兩個端點
find(a)
find(b)
q的詢問結果=info[a]+info[b]
解決github訪問問題
github這是個好地方。但是,上不去就蛋疼。今天github上不去,果斷f12下,看下network。發現裡面好多請求都是指向 github.global.ssl.fastly.net這個網域名稱的,然後請求都無法成功。想到了改hosts,於是cmd裡ping github.global.ssl....
我們怎麼問問題
吳旻泰巖網路工作室 老闆前些天找我談了一次,是關於研發團隊人員的能力問題。他提了兩個人,表示他們能力不強。老闆是屬於 眼觀六路 耳聽八方 的那種領導風格,因為是技術出身,所以一聽一看之間,就大體能得出靠譜的判斷。坦誠地說,被提到的同事還都是屬於實幹型的程式設計師,他們有其自身的優點 但實事求是地講,...
關於線段樹的區間修改與區間詢問問題
有一類問題,它們的大意都是維護一段序列,給出兩種操作,一種是對一段區間進行整體修改,一類是對一段區間詢問其中元素的極值或者和。這一類問題通常是使用線段樹來解的,然而,如果操作比較簡單,線段樹的實現也會有不同的方法,這裡以最簡單的一道題poj 3468為例。第一種方法 線段樹 lazy標記 我們使用l...