[洛谷P1631]序列合并
Posted Mrsrz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[洛谷P1631]序列合并相关的知识,希望对你有一定的参考价值。
题目大意:给你两个非降序序列a和b,每个序列n个数,在a和b各取一个数相加,能得到$n^2$个和,求这些和中最小的n个。
解题思路:我们先把a[1]+b[1],a[1]+b[2],a[1]+b[3]...a[1]+b[n]扔进一个小根堆里,每次取出一个数,设为a[i]+b[j],那么我们输出这个数,并把a[i+1]+b[j]放进堆里,循环n次就能得出答案。时间复杂度$O(n\log n)$。
我用pbds的优先队列+pair实现,用第二个数保存a[i]+b[j]的i值。
然而我第一次push时i值没有加1,于是WA。加了1就是AC╭(╯^╰)╮
C++ Code:
#include<ext/pb_ds/priority_queue.hpp> #include<cstdio> #include<functional> using namespace std; using namespace __gnu_pbds; typedef pair<int,int> pr; __gnu_pbds::priority_queue<pr,greater<pr> >q; int n,a[100005],b[100005]; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d",&a[i]); for(int i=1;i<=n;++i){ scanf("%d",&b[i]); q.push(make_pair(a[1]+b[i],1)); } bool space=false; for(int i=1;i<=n;++i){ pr p=q.top();q.pop(); if(space)putchar(‘ ‘);else space=true; printf("%d",p.first); q.push(make_pair(p.first-a[p.second]+a[p.second+1],p.second+1)); } puts(""); return 0; }
以上是关于[洛谷P1631]序列合并的主要内容,如果未能解决你的问题,请参考以下文章