luogu 1631 序列合并

priority_queue的使用,注意

a[1]+b[1],a[1]+b[2],a[1]+b[3],a[1]+b[4].......a[1]+b[n]

a[2]+b[1].........

..

a[n]+b[1].......a[n]+b[n]

先放入每一行的第1个,a代表行,b代表列,弹出的值在哪一行,再新加入这一行的下一个元素

类似cdq减少维度

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++) 
using namespace std;
const int N=100050;

int a[N],b[N],k[N],n;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    rep(i,1,n) cin>>a[i];
    rep(i,1,n){
        cin>>b[i];k[i]=1;
        q.push(pair<int,int>(a[i]+b[1],i));
    }while(n--){
        pair<int,int> u=q.top();q.pop(); 
        printf("%d ",u.first);
        int i=u.second;
        q.push(pair<int,int>(a[i]+b[++k[i]],i));
    }return 0;
}

 

posted @ 2018-09-02 15:35  ASDIC减除  阅读(75)  评论(0编辑  收藏  举报