noi online 2022
P8251 [NOI Online 2022 提高組] 丹釣戰
考慮單調棧找到每一位最左邊的一個不能彈出的節點,記為 \(L[i]\) ,則問題變為:
詢問區間 \([l,r]\) 中有多少個數的 \(L[i]\) 小於 \(l\)。
直接上主席樹就好了。
P8252 [NOI Online 2022 提高組] 討論
將每一個人會的題視為一個集合,那麼兩個人之間集合的交集情況不外乎三種:交集為空,交集為其中一個集合,或者交集為兩個集合的各自一部分。
考慮到這點,我們發現如果兩個集合之間的交集為空,則不會被統計答案。
若兩個集合之間的交集為其中的一個集合,那麼也不會被統計答案。
只有最後一種情況會被統計答案。
做法:我們可以將所有集合按照大小排序,從小到大依次加入,如果新加入的這個集合能完全覆蓋另一個集合,則另一個集合就可以從總的集合中刪除,如果新加入的集合與之前所有的集合交集都為空,那麼給這個集合中的元素打上屬於該集合的標記。
如果該集合能夠與之前有過的集合產生上面第三點的聯絡,就可以直接輸出答案。
想想為什麼在完全覆蓋的時候被覆蓋的集合能夠從總集合中刪除。
如果存在三個集合 \(A,B,C\),且 \(|A|<|B|<|C|\),且 \(B\) 能完全覆蓋 \(A\),\(A\) 與 \(C\) 的聯絡滿足上面第三點。
則 \(B\) 與 \(C\) 的聯絡一定滿足上面第三點。
首先 \(B\)
其次 \(C\) 不能完全覆蓋 \(B\),因為 \(B\) 能完全覆蓋 \(A\),這樣 \(C\) 是完全覆蓋 \(A\) 的,與題設相違。
那麼,\(B\) 與 \(C\) 的關係就一定是滿足上面第三點的了。
所以,我們只需要按照集合大小排序,然後對每一個人判斷其與之前的人的集合的交集情況。
因為對於每一個集合中的每一個元素都要列舉到,時間複雜度是 \(O(T\sum k)\) 的。