中間數(二分) 單調佇列

2022-05-18 08:51:15 字數 976 閱讀 8006

1、中間數

(mid.cpp/c/pas)

【問題描述】:

有n個整數

a1-an

,任意兩個整數做絕對值差

|ai-aj|

(1<=i)可以得到

n*(n-1)/2

個絕對值差,令

m=n*(n-1)/2

,保證m

一定是個偶數,求第

m/2小的數

【輸入格式】:

輸入檔名為mid.in。

第一行,乙個整數n

接下來n行,每行乙個整數ai(

1<=ai<=1000,000,000)

【輸出格式】:

輸出檔名為mid.out。

一行,第m/2小的整數

【輸入輸出樣例】:

mid.in

mid.out

【輸入輸出樣例說明】

絕對值差分別是|1-10|=9,|1-2|=1,|1-3|=2,|10-2|=8,|10-3|=7,|2-3|=1

m=6,所以第

m/2小的數是

2【資料說明】

30%1<=n<=1000

100%1<=n<=200000

題解:開始的時候想不到如何去求解,最後還是yzh大神solve了。這道題不錯的,絕對值找中間數,

我不知道這個中間數是幹什麼用的,感覺完全可以給乙個k來尋找第k大,或者第k小的解。題目是關

於絕對值的,可以轉化一下,排個序,這樣講問題轉換為:

我們設a[i+1]-a[i]=b[i],就是在乙個集合中,集合元素為∑bi-j,問中間數,可以因為其值範圍為1000000000,

隨意想到了log 10^9*n這樣的複雜度,二分乙個x,如何知道比x小的有多少個,用乙個單調佇列,

比如1擴充套件到了z,那麼2至少可以擴充套件到z,這樣,來解決,以每個左端點為起點的答案數字r-l+1個,

這樣是o(n)的,所以複雜度有了保證。

尋找段落(二分 單調佇列)

題目描述 給定乙個長度為n的序列a i,定義a i 為第i個元素的價值。現在需要找出序列中最有價值的 段落 段落的定義是長度在 s,t 之間的連續序列。最有價值段落是指平均值最大的段落,段落的平均值 段落總價值 段落長度。輸入輸出格式 輸入格式 第一行乙個整數n,表示序列長度。第二行兩個整數s和t,...

二分答案 單調佇列 尋找段落

二分答案 單調佇列字首和維護 每次二分乙個平均值k,序列中的數全部減去k,如果序列中存在長度在 s,t 中且和超過0的子串行,則證明仍然有更大的平均值,到 mid,r 中找,反之,則到 l,mid 中找 這個操作用單調佇列維護 i s q tail 且 sum i s sum q tail 說明i ...

《單調佇列》《二分》4 偷懶的西西

高三數學作業總共有n道題目要寫 其實是抄 編號1.n,抄每道題所花時間不一樣,抄第i題要花a i 分鐘。由於西西還要準備noip,顯然不能成天做數學作業。所以西西決定只用不超過t分鐘時間抄這個,因此必然有空著的題。每道題要麼不寫,要麼抄完,不能寫一半。一段連續的空題稱為乙個空題段,它的長度就是所包含...