洛谷 P1631 序列合併

2022-05-16 01:29:45 字數 1066 閱讀 6512

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

輸入格式:

第一行乙個正整數n;

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

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

輸出格式:

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

輸入樣例#1: 複製

3

2 6 6

1 4 8

輸出樣例#1: 複製

3 6 7

【資料規模】

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

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

如何在樸素做法$n^2$之上進行優化?我們每次都是要取出當前最小的兩個數進行合併。由於原序列是有序的,$a[1]$是一定會被取到的。假設我們當前取出的是$a[i]+b[j]$,那麼我們下一次取的就是$a[i]+b[j+1]$或$a[i+1]+b[j]$。我們先把$b$序列中所有數與$a[1]$的和放入優先佇列,這樣就滿足了$a[i]+b[j+1]$的情況。(因為$a[1]$一定比$a$陣列後面的優

所以重點就是處理$a[i+1]+b[j]$,每次把取出$b[j]$對應的取到$a$陣列中的位置往後移乙個加入佇列即可。

【注意】優先佇列套$pair$是預設按第乙個元素從大到小排序。

#include#include

#include

#include

using

namespace

std;

int n, a[100005], b[100005], to[100005

];priority_queue

< pair < int, int >, vector < pair < int, int > >, greater < pair < int, int > > >q;

intmain ( )

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

return0;

}

洛谷 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 的資料中,滿...

洛谷 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.輸出僅一行,包含n個整數,從小到大輸出這n個最小的和,相鄰數字之間...

洛谷P1631 序列合併

序列合併 問題描述 有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個 n 100000 分析 a i 與b j 相加後,下面相加的一定是a i 1 b j 或a i b j 1 一開始我們把b 1 與a中所有元素相加放入乙個小根堆裡,輸出min,然...