P1631 序列合并

给你两个1e5的序列问两个序列所有的数合并后总共N^2个数中前N个数的大小
我们先对数组进行排序,得到两个有序的数组AB
之后我们再把A[1]+B[1].A[1]+B[2],…,A[1]+B[N]这样的得出N个有序数列每个数列有N项
接着我们开一个优先队列把这个矩阵中第一列放进去,然后每次拿出最小的后,把那一行后一列加入到优先队列中,最终NlogN解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;
#define mk(a,b) make_pair(a,b)
priority_queue<pair<int,int> > q;
int a[100005],b[100005],p[100005];
int main()
{
int n,cnt=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),p[i]=1;
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++) q.push(mk(-(a[i]+b[1]),i));
while(q.size()&&cnt<n)
{
printf("%d ",-q.top().first);
int id=q.top().second;
q.pop();
q.push(mk(-(a[id]+b[++p[id]]),id));
cnt++;
}
}
就算是一分钱,也是对作者极大的支持
------ 本文结束 ------

版权声明

Baccano by baccano is licensed under a Creative Commons BY-NC-ND 4.0 International License.
baccano创作并维护的Baccano博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于baccano 博客( http://baccano.fun ),版权所有,侵权必究。

小游戏

---小游戏:要不要来选择一下自己可能的老婆?---

简易发声器

---简易的七键钢琴插件---

可以使用鼠标点击琴键也可以使用主键盘1-7或者小键盘的1-7来操作

那么现在开始吧

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
0%