1. 程式人生 > 其它 >CF1529B Sifid and Strange Subsequences

CF1529B Sifid and Strange Subsequences

\(\text{Description}\)

給定長度為 \(n\) 的序列 \(a\),求一個子集 \(S\),使得 \(\forall i,j\in S,|a_i-a_j|\ge \text{MAX}\),其中 \(\text{MAX}=\max_{i\in S} a_i\),最大化 \(|S|\)

\(\text{Solution}\)

首先對於所有的非正數,都是可以新增進來的。因為新增所有的非正數,\(\text{MAX}\le0\),而一個數的絕對值 \(\ge 0\),所以一定是滿足條件的。

而對於正數,有如下兩個結論:

  1. 最多隻能新增一個正數。

\(\text{proof:}\)

考慮反證法,設選擇了 \(x,y\),假設 $0\lt x\le y $,則有 \(y-x \lt y\),與條件相悖,故原命題成立。

  1. 如果能新增正數,新增的正數一定是最小的正數。

考慮將所有負數想象成數軸上的點,那麼新增正數等同於詢問是否有兩個點的距離小於這個正數,如果有很顯然不成立。那麼如果連最小的正數都不能滿足,之後的正數一定不能滿足這個條件。

而如何檢驗一個正數是否能加進來呢?

其實方法已經在結論 \(2\) 的證明中提到了,我們將所有數排序,看是否有兩個數之間的差小於該正數即可。

時間複雜度:\(\Theta(n\log n)\) (排序的複雜度)。

程式碼不難寫,就不放了。