序列合并

P1631 序列合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 原理:
    • a[1]+b[1]<a[1]+b[2]<...<a[1]+b[n]
    • a[2]+b[1]<a[2]+b[2]<...<a[2]+b[n]
    • ...
    • a[n]+b[1]<a[n]+b[n]<...<a[n]+b[n]
  • 一共有以上n^2个数字取其中n个
  • 首先把第一列的所有入队
  • 然后每次输出队首元素,输出后找到输出的那一行将那一行的下一个入队
  • 优先队列里的idx记录是哪一行,place记录第i行到了第几列
#include <bits/stdc++.h>
using namespace std;
#define N 1e5
#define INF 2e9
#define MAX 10000000
// 3
// 2 6 6
// 1 4 8
struct Node
{
    int sum, idx;
    bool operator<(const Node &a) const
    {
        return sum > a.sum;
    }
};
priority_queue<Node> q;
int n, a[MAX], b[MAX], idx[MAX], place[MAX];
int main()
{
    cin >> 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(Node{b[1] + a[i], i});
        idx[b[1] + a[i]] = i;
    }
    for (int i = 1, j; i <= n; i++)
    {
        printf("%d ", q.top().sum);
        j = q.top().idx;
        q.pop();
        place[j]++;
        q.push(Node{a[j] + b[place[j] + 1], j});
    }
}

 

posted on 2022-09-02 11:10  樵风  阅读(53)  评论(0)    收藏  举报