1. 程式人生 > 其它 >noi online 2022

noi online 2022

P8251 [NOI Online 2022 提高組] 丹釣戰

考慮單調棧找到每一位最左邊的一個不能彈出的節點,記為 \(L[i]\) ,則問題變為:

詢問區間 \([l,r]\) 中有多少個數的 \(L[i]\) 小於 \(l\)

直接上主席樹就好了。

code

P8252 [NOI Online 2022 提高組] 討論

將每一個人會的題視為一個集合,那麼兩個人之間集合的交集情況不外乎三種:交集為空,交集為其中一個集合,或者交集為兩個集合的各自一部分。

考慮到這點,我們發現如果兩個集合之間的交集為空,則不會被統計答案。

若兩個集合之間的交集為其中的一個集合,那麼也不會被統計答案。

只有最後一種情況會被統計答案。

做法:我們可以將所有集合按照大小排序,從小到大依次加入,如果新加入的這個集合能完全覆蓋另一個集合,則另一個集合就可以從總的集合中刪除,如果新加入的集合與之前所有的集合交集都為空,那麼給這個集合中的元素打上屬於該集合的標記。

如果該集合能夠與之前有過的集合產生上面第三點的聯絡,就可以直接輸出答案。

想想為什麼在完全覆蓋的時候被覆蓋的集合能夠從總集合中刪除。

如果存在三個集合 \(A,B,C\),且 \(|A|<|B|<|C|\),且 \(B\) 能完全覆蓋 \(A\)\(A\)\(C\) 的聯絡滿足上面第三點。

\(B\)\(C\) 的聯絡一定滿足上面第三點。

首先 \(B\)

\(C\) 不能交集為空,因為 \(A\)\(C\) 一定有交集,而 \(B\)\(C\) 也有交集。

其次 \(C\) 不能完全覆蓋 \(B\),因為 \(B\) 能完全覆蓋 \(A\),這樣 \(C\) 是完全覆蓋 \(A\) 的,與題設相違。

那麼,\(B\)\(C\) 的關係就一定是滿足上面第三點的了。

所以,我們只需要按照集合大小排序,然後對每一個人判斷其與之前的人的集合的交集情況。

因為對於每一個集合中的每一個元素都要列舉到,時間複雜度是 \(O(T\sum k)\) 的。

code