1. 程式人生 > 其它 >NOI Online 2022 題解

NOI Online 2022 題解

NOI Online 2022 題解

A. 丹釣戰

首先考慮暴力,即對給定區間模擬題意的單調棧過程,所有在單調棧中沒有前驅的元素數量就是答案。

發現這樣會對一些區間做很多次重複的單調棧操作,那麼考慮能否只對整個序列做一次就達到目的。

發現是可以的,只不過問題會轉化為求區間 \([l,r]\) 中滿足前驅的編號小於 \(l\) 或不存在前驅的元素數量,

這形如二維偏序問題,用離線樹狀陣列即可。

還有一種做法,是從左端點 \(l\) 的元素開始不停往右跳,每次跳到當前位置在單調棧中的後繼元素,

直到跳到右端點之外,跳的總次數就是答案。用倍增優化跳的過程,即可保證複雜度並通過本題。

這道題的啟發是,考試時一定要對拍。

B. 討論

考慮題中的包含關係 \(S(x)\in S(y)\) 只會在 \(|S(x)|\le |S(y)|\) 時出現,

故先將所有人按題目數量降序排序,從而將一個包含的限制轉化為對編號大小的限制。

此時考慮一組解 \((x,y)\) 的兩種情況,分別是 \(|S(x)|=|S(y)|\)\(|S(x)|<|S(y)|\)

第一種情況是好做的,因為當 \(|S(x)|=|S(y)|\) 時,只有形如 \(S(x)=S(y)\) 的情況才存在包含關係,

那麼將這種情況判掉後,唯一需要判的只有交集非空,這個開個桶就可以找到合法解。

現在考慮第二種情況。首先,若原問題存在解,且存在 \(y>x\)

滿足 \(S(x)\subseteq S(y)\)

則一定存在一組解 \((u,v)\),滿足 \(u<v\)\(v\ne x\),原因是若 \((x,v)\) 是一組解,則 \((y,v)\) 也一定是一組解。

那麼我們考慮,在排序後順序掃描每個元素並維護桶 \(buck\),其中 \(buck(i)\) 儲存題目數最少且會第 \(i\) 道題的人。

此時嘗試為第 \(x\) 個人找到 \(y<x\) 使得 \((x,y)\) 是最優解,方法是遍歷 \(S(x)\) 中的所有元素 \(u_1,u_2,\cdots u_k\)

若所有 \(i\)\(buck(u_i)\)

都相同,那麼如果存在合法解,則一定存在合法解 \((u,v)\) 滿足 \(u<v\)\(v\ne x\)

否則令 \(y=\max\limits_i(buck(u_i))\),此時 \((x,y)\) 就是一組合法解,以下給出這個斷言的證明:

若所有 \(i\)\(buck(u_i)\) 都同為 \(t\),則有 \(S(x)\subseteq S(t)\),這種情況下已經證明過 \(x\) 是沒用的,

否則一定滿足 \(S(x)\nsubseteq S(y),S(y)\nsubseteq S(x),S(x)\cap S(y)\ne\varnothing\)

由於維護 \(buck\) 也是簡單的,故這道題就做完了,複雜度是 \(O(n\log n)\),顯然可以通過。

C. 如何正確的排序

首先發現,題中所求式形如 \(m-1\) 維數點,故可以用 cdq 分治解決本題,複雜度 \(O(n\log^2n)\),常數較大。

實際上,因為題中式子形如 \(\max\limits_{k\in U}(x_{k,i,j})+\min\limits_{k\in U}(x_{k,i,j})\) 的形式,其中 \(U=[1,m]\cap Z^+\)

故對於 \(m\) 為偶數的情況,我們可以將問題轉化為 \(m-2\) 維數點。

具體來說,我們將式子中的 \(\max\),用容斥的思想將其拆成若干 \(\min\) 的線性組合,即:

\(\max\limits_{k\in U}(x_{k,i,j})+\min\limits_{k\in U}(x_{k,i,j})=\sum\limits_{1\le l\le m}((-1)^{l-1}\sum\limits_{S\subseteq U,|S|=l}\min\limits_{k\in S}(x_{k,i,j}))+\min\limits_{k\in U}(x_{k,i,j})\)

而當 \(m\) 為偶數時,式子中的 \(\min\limits_{k\in U}(x_{k,i,j})\) 會被 \(\max\) 所拆開的式子中的一項抵消,

而剩餘式子中的每一項,都可以用不超過 \(m-2\) 維數點來解決,總時間複雜度是 \(O(2^m n\log n)\),常數不大。