洛谷P5682 次大值 題解

2022-05-19 21:36:10 字數 1997 閱讀 9867

alice 有 \(n\) 個正整數,數字從 \(1 \sim n\) 編號,分別為 \(a_1,a_2, \cdots , a_n\)。

bob 剛學習取模運算,於是便拿這 \(n\) 個數進行練習,他寫下了所有

\(a_i\) mod \(a_j (1 \le i,j \le n \wedge i \neq j)\)

的值,其中 mod 表示取模運算。

alice 想知道所有的結果中,嚴格次大值是多少。將取模後得到的所有值進行去重,即相同的結果數值只保留乙個,剩餘數中第二大的值就稱為嚴格次大值。

首先我們要排除無關因素帶來的影響。

這裡很明顯的乙個無關因素就是重複的元素。

我們假設存在 \(a_i = a_j\) 且 \(i \neq j\),則對於任何乙個 \(k \neq i \wedge k \neq j\):

所以數值相同的兩個元素是等價的。

我們可以給 \(a1\) 到 \(a_n\) 從小到大排序並去重。

我們假設去重後還剩下 \(m\) 個元素,且這些元素滿足 \(a_1 \lt a_2 \cdots \lt a_m\)。

則我們可以分 \(m=1\)、\(m=2\)、\(m \gt 2\) 三種情況分開討論:

當 \(m=1\) 時,陣列中只有乙個元素:

當 \(m=2\) 時,只有兩個候選答案 \(a_1\) mod \(a_2\) 和 \(a_2\) mod \(a_1\),又因為 \(a_1\) mod \(a_2 = a_1\),\(a_2\) mod \(a_1 \lt a_1\)(餘數必然小於除數),所以次大值肯定是 \(a_2\) mod \(a_1\)。

當 \(m \gt 2\) 時,可以確定的是最大值是 \(a_\) mod \(a_m\)。

次大值應該是以下兩者的較大值:

為了方便講述起見,我接下來用 \(a \% b\) 來表示 \(a\) mod \(b\),並且我們這裡只證明 \(m \gt 2\) 的情況。

這裡有乙個非常重要的基礎性質:

性質1:餘數永遠小於除數!

我們接下來會反覆運用到這個性質1進行分析。

因為 \(a_ \% a_m = a_\)。

證:我們把 \(a_i \% a_j\) 的組合分為 \(2\) 部分:

第一部分:\(j=m\)

此時 \(i \in [1, m-1]\),

\(a_1 \% a_m \lt a_2 \%a_m \lt \cdots \lt a_ \% a_m\)

所以第一部分的最大值是 \(a_ \% a_m = a_\)

第二部分:\(j \neq m\),

此時,除數最大是 \(a_\),根據性質1,可得:這一部分的所有答案都小於 \(a_\)。

據此可得:最大值即為 \(a_ \% a_m = a_\)。

次大值其實就是除了 \(a_\) 以外的最大值。

第一部分裡面除了 \(a_ \% a_m\) 以外的最大值就是 \(a_ % a_m = a_\) 了。

第二部分我們可以將它拆分成兩小部分:

第2.1部分:\(j = m-1\) 的部分,這一部分的是 \(a_\) 和 \(a_m \% a_\) 的較大值;

第2.2部分:\(j \le m-2\) 的部分,根據性質1,這一部分的所有答案都 \(\lt a_\)。

綜上所述,我們可以發現,次大值的競爭者只有 \(2\) 個值:\(a_\) 或者 \(a_m \% a_\)。

所以此時次大值即為 \(\max(a_, a_m \% a_)\)。

另附上一張方便理解:

實現**如下:

#include using namespace std;

const int maxn = 200020;

int n, m, a[maxn], ans;

int main()

洛谷 P2829 大逃離 題解

題目鏈結 一道模板的次短路 設 d is x dist x dis x dist x dis x dis t x 分別為點 1 11 到 x xx 的最短路和次短路長度 我們只需在跑最短路時,順帶更新一下次短路 由於每個點可以經過多次,我們只能使用 spfa 對於每條邊 x,y x,y x,y 考慮...

洛谷 P4933 大師 題解(dp)

設定 dp i j 表示以 i 結尾公差為 j 的等差數列個數 你可能會想為什麼是 i 結尾而不是開始呢,其實你會發現如果設以 i 開始根本不知道怎麼設狀態轉移方程 注意轉移方程要設定偏移量p,要不然陣列可能就會負數。所以陣列開大兩倍。還有要注意ans加的不是dp i a i a j p 因為可能後...

洛谷P1373小a和uim大逃離題解

這個題好坑啊,首先是他會卡空間,然後我們就只能把一種比較好理解的狀態給捨棄,因為空間開不下,然而採用一種難理解的狀態就是 dp i j l 0 1 表示 i j 位置,兩者的差為 l 當前由誰來吸收的方案數。然後我們就可以推出狀態轉移方程,此狀態轉移方程很好寫,主要就是狀態非常難想,因此我們如果狀態...