1. 程式人生 > >【2018ICPC青島】

【2018ICPC青島】

答案 tarjan 若是 表示 是把 聯通 一個 多少 判斷

B

題意:給n個問題,每個問題有一個固定的答案ai(<=10^5).現在有m個約束關系,每個約束關系是一個二元組(ui,vi),表示你回答ui、vi問題的答案必須一樣。

現在讓你輸出分別修復一個約束,然後回答每個問題,最多能答對多少道。

分析:約束關系其實是弱聯通關系,要求回答每個聯通塊是一樣的。所以建一個圖。

然後考慮拆掉一個約束關系(一條邊),可以發現如果處在一個強連通分量內,拆掉對答案沒有影響。所以先tarjan縮編然後重建樹。

若是一條橋邊,那麽就是把樹拆成多個部分,更新答案。

具體我想可以通過dsu(長鏈剖分啊,重鏈剖分啊,把答案先存在重心上分治),或者通過樹上的線段樹合並(不知道內存會不會炸)。

線段樹合並的做法:對那個聯通塊的根rt,fa(vi)=ui,更新答案可以 = tree(rt)-tree(ui) 和tree(ui)-tree(vi)-val(ui) 和tree(vi) - val (ui) 。

E

題意:有n棵植物從1到n,初始能力值都為0,還有個成長值ai。有個機器人,初始在0,如果機器人走到i,那麽i植物能力值加上ai,現在給出機器人的活動步數m(<=10^12),求使得所有植物能力值最小值最大的值。

分析:二分答案,然後轉化為每個植物至少要走ki次,判斷是否能滿足。據說從左到右貪心就可以了。

【2018ICPC青島】