fold的毒瘤題

2021-08-16 17:02:54 字數 1957 閱讀 9913

做法1.

可以仿照最小生成樹的kruskal做法, 將邊權按照從小到大排序

對於每個詢問: 按邊權從小到大依次連線各個邊, 同時用並查集維護特殊點的連通性, 一旦某條邊加入後, 遍歷所有的特殊點發現它們屬於同一集合, 那麼答案就是這條邊的邊權

複雜度: o(

m⋅lo

gm+q

⋅m⋅n

)

做法2.

對於某個權值

x , 如果權值不超過

x的邊能使所有特殊點連通, 那麼對於

>

x 的所有權值也一定能使特殊點連通, 滿足單調性, 即二分性質

所以二分列舉

x , 用df

s判斷特殊點是否連通, 如果特殊點連通, 那麼將答案範圍縮小至[x

,r] , 反之答案變為: [l

,x−1

]

複雜度: o(

n⋅lo

gv)

答案很顯然在最小生成樹上取到, 這樣就將原圖轉化成了一顆樹

其中與hard乙個很顯然的不同就是: 點數不超過20個

所以只需要暴力求出這20個點兩兩之間路徑上的最大值就好了

對於求: 兩點之間樹上路徑最大值有2個做法:

做法1.

樹鏈剖分 複雜度: o(

log2

n)

(我自己提交的樹鏈剖分tle了, 我本意是: 不卡這個log的)

做法2.

倍增求lca的同時維護max[i][j]代表: 第i個節點到向上2j

個節點的路徑上的最大值

然後一邊求lca的同時求出到lca的路徑上的最大值, 兩個最大值中較大的乙個就是答案 複雜度:o(

logn

)

所以總的複雜度為: o(

q⋅20⋅

logn

)

設定乙個常數k

p>

k 時, 這時候%p

=c的點不超過k個, 向上面mid一樣做就好了, 假設這樣的詢問有q1

個, 時間複雜度:o(

q1⋅k

⋅log

n)

當p≤

k 時, 將答案離線下來並按照p和c從小到大排序, 同時處理出所有p相同且c相同的區間詢問

對於同乙個pi

和ci,將所有%p

i=ci

的點, 兩兩(cj

和cj+p

)求路徑上的最大值, 並將這個相鄰最大值更新到線段樹上, 對於乙個區間詢問, 直接從線段樹上獲得[l

,r] 的區間最值就好了

關於複雜度, 最壞情況就是每乙個p和c都不相同, 然而p只有不超過k個

對於某個pi

, %p

i=0,

1,⋯,

pi−1

的點一共是n個, 所以每個點只會被更新(或刪除)到線段樹上一次

假設這樣的詢問有q2

個, 複雜度最壞情況: o(

q2⋅k

⋅n⋅l

ogn)

當k=

n√時, 總時間複雜度為:o(

nn√l

ogn)

LOJ6087 毒瘤題 題解

n 個數的陣列,其中恰好有 k 個數出現了奇數次。把他們找出來。n 3e6,k 2 空間 2m k 1 直接全部異或起來。k 2 假設出現奇數次的是 a 和 b,那麼把所有數異或起來得到的就是 s a b。對每個二進位制位維護乙個數 w i 當讀入乙個 x,x 的第 j 位為 1 的時候,就把 w ...

LOJ 6087 毒瘤題 (數論)

題目大意 在集合中找出 k k 2 個出現了奇數次的正整數 a。注意記憶體 2mb 當k 1的時候,我們可以對所有的數求異或和,得到的異或和即為a,因為出現偶數次的都兩兩消掉了。k 2的時候,我們得到的異或和是a b。對於二進位制的每一位維護cnt i 表示有多少數二進位制的第i位中1,c i 表示...

毒瘤 dp 題做題記錄

題目鏈結 設 f 表示以 i 結尾的一組選擇了 j 個數,剩下的也能湊出一組時,剩下一組結尾數的最小值。當 a a i 時,i 與 i 1 可以分到一組,因此 f max f f 當 a f 時,i 1 能分到剩下的一組,該組原有 j i 個數,因此 f max f a i include incl...