有兩個長度都是n
n的序列aa和b
b,在aa和b
b中各取乙個數相加可以得到n2n
2個和,求這n2n
2個和中最小的nn個。
ac500祭
ac500
祭
我的正確率是真的低qwq
由於題目中說a,b
a,b都是單調遞增的。所以就可以不考慮排序。
單調遞增同時特滿足了a[
x]+b[1]
x]+b
[2]<..>
.x]+a
[n](
x∈[1
,n])
a[x]
+b[1
]x]+b
[2]<..>
.x]+a
[n](
x∈[1
,n])
所以我們每次只要維護n
n個數的最小值就可以了(分別是a[1
]+b[
k1],
a[2]
+b[k
2],.
..,a
[n]+
b[kn
]a[1
]+b[
k1]
,a[2
]+b[
k2]
,...
,a[n
]+b[
kn]
,其中kik
i表示ii
所維護完的b
b陣列指標)
求最小值可以考慮維護乙個小根堆。每乙個元素維護乙個三元組(va
l,x,
k)(v
al,x
,k),表示這個a[x
]+b[
k]a[
x]+b
[k]的值。
如果(val
i,xi
,ki)
(val
i,x
i,k
i)是堆裡的最小值,那麼就輸出val
ival
i,彈出,並插入(a[
xi]+
b[ki
+1],
xi,k
i+1)
(a[x
i]+
b[ki
+1]
,xi
,ki
+1)。
做nn次上述方法即可。
時間複雜度o(n
logn)
o(nlogn)
#include
#include
#define mp make_pair
using
namespace std;
const
int n=
100010
;int n,a[n]
,b[n]
;priority_queue
int,pair<
int,
int>
>
> q;
//pair套pair最為致命(三元組)
intmain()
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,然...