P1631 序列合併

2022-02-19 08:46:37 字數 1199 閱讀 5475

有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n^2個和,求這n^2個和中最小的n個。

輸入格式:

第一行乙個正整數n;

第二行n個整數ai​, 滿足ai​≤ai+1​且ai​≤10^9;

第三行n個整數bi​, 滿足bi​≤bi+1​且bi​≤10^9.

【資料規模】

對於50%的資料中,滿足1<=n<=1000;

對於100%的資料中,滿足1<=n<=100000。

輸出格式:

輸出僅一行,包含n個整數,從小到大輸出這n個最小的和,相鄰數字之間用空格隔開。

輸入樣例1:

326

6148

輸出樣例1:

3

67

思路:大根堆處理,如果對於每乙個二元組,我們都壓入堆中,複雜度將是o(n2logn),會t掉,所以我們對於加入操作進行優化。

考慮到如果a[i]+b[i]對於堆沒有貢獻,那麼a[i]+b[i+1]也一定不會對堆有貢獻,所以直接break掉就好。複雜度降為o(nlog2n),最後有證明。

**:

#include#include

#include

#include

#define maxn 100008

using

namespace

std;

intn,a[maxn],b[maxn],ans[maxn];

priority_queue

q;long

long

read()

while(ch>='

0'&&ch<='9')

return x*f;

}int

main()

for(int i=1;i<=n;++i)

for(int i=n;i>=1;--i) printf("

%d "

,ans[i]);

return0;

}

複雜度證明:

第一行至多掃完它的1/1

第二行變為1/2

以此類推,第i行至多1/i​(1≤i≤n)

合在一起,共1/1+1/2+...+1/n

尤拉證明過,上面的無窮級數的增長率為o(lnn)的

因此,總複雜度為o(nlognlnn)也就是o(nlog2n)的,證畢

P1631 序列合併

做法 將 a 和 b 都從小到大排一遍序。然後組成這樣乙個矩陣 a1 b1 a1 b2 a1 b3 a1 bn a2 b1 a2 b2 a2 b3 a2 bn a3 b1 an b1 an b2 an b3 an bn 正確性 我們先把每行的頭扔進堆裡,每行的頭是每行中的最小值,所以這樣我們能在堆裡...

P1631 序列合併

有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。輸入格式 第一行乙個正整數n 第二行n個整數ai,滿足ai ai 1且ai 10 9 第三行n個整數bi,滿足bi bi 1且bi 10 9.資料規模 對於50 的資料中,滿足1 n 1000 對於...

P1631 序列合併

有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到 n 2n2 個和,求這 n 2n2 個和中最小的n個。輸入格式 第一行乙個正整數n 第二行n個整數 a iai 滿足 a i le a ai ai 1 且 a i le 10 9ai 10 9 第三行n個整數 b ibi 滿足 b i ...