P1631 序列合并
P1631 序列合并
有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2N2个和,求这N^2N2个和中最小的N个。
对于100%的数据中,满足1<=N<=100000。
- 思路巧妙,直接看代码
#include <cstdio> #include <algorithm> #include <iostream> #include <queue> #include <cstring> #include <algorithm> using namespace std; #define res register int inline int read() { int x=0,f=1;char ch; while(!isdigit(ch=getchar())) if(ch=='-') f=-1; while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return f*x; } const int N=100000+10; int n,m; int a[N],b[N]; priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q; int cnt[N]; int main() { n=read(); for(res i=1 ; i<=n ; ++i) a[i]=read(); for(res j=1 ; j<=n ; ++j) { b[j]=read(); cnt[j]=1; q.push(make_pair(a[1]+b[j],j)); } // sort(a+1,a+n+1); sort(b+1,b+n+1); for(res i=1 ; i<=n ; ++i) { pair<int,int> x=q.top(); q.pop(); printf("%d ",x.first); int id=x.second; q.push(make_pair(a[++cnt[id]]+b[id],id)); } return 0; }