洛谷P1631 序列合併 堆

2022-09-01 09:51:14 字數 1635 閱讀 2560

有兩個長度都是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

log⁡n)

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,然...