做法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...