傳送門
題意:有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到
題解:先排序得到兩個遞增的數列a和b,然後用小根堆維護a+b,每次取隊首,如果這次取出的是a[i]+b[j],則往佇列中
插入a[i]+b[j+1],所以需要另開乙個陣列p[i]來記錄每乙個a[i]應該匹配的b。正確性顯然:取前k小值等價於取k次當前最小值,如果a[i]+b[j]都沒被取到,那a[i]+b[j+1]考都不用考慮,後面的b就更不說了。
#include#include#include#include#includeusing namespace std;
const int n=1e5+4;
int n,a[n],b[n],p[n];
struct node
};priority_queueq;
inline int read()
while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}int main() ;
q.push(cur);
} int k=n;
while (k--) );
} puts("");
return 0;
}
序列合併(luogu 1631)題解
有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。32 6 6 1 4 8 3 6 7 這道題目其實是一道裸的最小堆的題目,而且它給出了ai a i 1 bi b i 1 我們連排序都可以不用排,我們建乙個堆為c,首先c中存放n個值,分別為a1 b...
(優先佇列)P1631 序列合併
有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2 個和,求這n 2個和中最小的n個。ai 1e9,bi 1e9,n 1e5.直接暴力用優先佇列存前n個,如果出現第乙個比當前最大值還大的值時退出迴圈保障複雜度 includeusing namespace std const int...
優先佇列 洛谷 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 109 第三行n個整數b ibi 滿足b i le b bi bi...