2024.10.24 鮮花

xrlong發表於2024-10-24

多次查詢給定集合是否存在任一給定子集

Re:End of a Dream


給定 \(n\) 個集合 \(S_n\)\(q\) 組詢問,每次給定一個集合 \(Q\),判斷其是否包含一個集合 \(S_i\)

先考慮經典例題 DZY Loves Chinese II

考慮其做法:隨機賦值非樹邊,用返祖邊來平衡使其權值為 \(0\),線性基維護。

考慮擴充套件,發現集合中並不存在一個唯一元素用來平衡,考慮在每個集合中加入一個元素來平衡。

這樣單次查詢前要加入每個集合的獨立元素,就是 \(O(集合大小+子集個數)\) 的,並沒有達到輸入下限,考慮用可撤銷線性基維護,每次就不用加入獨立元素了,總複雜度是 \(O(\sum 子集大小+q\times 集合大小)\)

好像 wang54321 有更巧妙的做法,但我和 TA 都忘了,就先這樣吧,複雜度是一樣的。

P

相關文章