hdu 4912 終於解脫了

2022-05-13 17:20:38 字數 1764 閱讀 9916

....歷經n發wa之後 終於解脫了

這感覺....無法言表...

其實 這題你說難吧? 對於我而言 一共就做過一道lca的人來說 是有點難的

可是吧 當你慢慢地寫下來 其實**那麼長 又不怎麼難

對於此題 就是先求出query中2個結點的lca之後 然後dfs它們的lca 根據深度進行排序

這個其實不難理解吧? 當然深度越大的 就是離根結點越遠 首先進行搜尋

然後 就是每搜到乙個點 就將它進行標記-已訪問過

深搜的時候 注意下 不僅要判斷是否訪問過 而且要判斷這2點的深度關係 肯定是從小的搜到大的

最最注意的就是

depth[v] = depth[u] + 1這句話 不要太隨意地寫在了lca_tarjan(v)的後面

表示 我就一不留神 寫錯了 找了好久。。

其餘的 就是可以再去好好思索下lca_tarjan的整個演算法實現過程

1 #include 2 #include 3 #include 4

using

namespace

std;56

intncnt , qcnt;

7const

int size = 100010;8

struct

data9;

16 data node[size*2

];17

intnhead[size];

18 data query[size*2

];19

data graph[size];

20int

qhead[size];

21bool

vis[size];

22int

father[size];

23int

depth[size];

24bool

check[size];

2526

bool

cmp( data p , data q )

2730

31void

init( )

3239

40int find( int

x )41

4445

void addnedge( int st , int

end )

4651

52void addqedge( int id , int st , int

end )

5360

61void lca_tarjan( int

u )6275}

76for( int i = qhead[u] ; ~i ; i =query[i].next )

7783}84

}

8586

void dfs( int

u )8796}

9798

intmain()

99112

for( int i = 0 ; i)

113120 lca_tarjan(1

);121 sort( graph , graph+m , cmp );

122for( int i = 0 ; i)

123132

}133 cout << ans <

134}

135return0;

136 }

view code

today:

關於思念你的這件小事

躲得過對酒當歌的夜晚

躲不過四下無人的街道

hdu 4912 貪心 最近公共祖先

先對所有的路徑求取lca,然後按照lca從大到小的順序選取路徑 若一條路徑p1的lca p1 的深度大於p2的lca p2 那麼若p1和p2出現衝突,那麼p1一定包含p2的lca p2 那麼p2只可能與以lca p2 為子樹中的路徑衝突,而p1要衝突的範圍更大,兩個的貢獻同樣是1,如果存在一棵比lc...

bzoj 4912 Sdoi2017 天才黑客

這個題和點沒什麼關係 之和邊與邊之間關係有關 我們就把邊看作點 邊權就是 lcp 點權看作這條邊本來的權值.現在考慮兩兩連邊 lcp 就是兩個點在 trie 樹上的 lca 的深度.這樣連邊是 o m 2 的 考慮優化 我們把乙個點的出邊和入邊都單獨拿出來 並按照 dfs 序排序 設排序之後的陣列為...

hdu1285 hdu4857 拓撲排序

一 原題內容 problem description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在...