P1631 序列合并

题目描述

有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。

输入输出格式

输入格式:

第一行一个正整数N;

第二行N个整数Ai,满足Ai<=Ai+1且Ai<=10^9;

第三行N个整数Bi, 满足Bi<=Bi+1且Bi<=10^9.

【数据规模】

对于50%的数据中,满足1<=N<=1000;

对于100%的数据中,满足1<=N<=100000。

输出格式:

输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。

输入输出样例

输入样例#1:

3
2 6 6
1 4 8

输出样例#1:

3 6 7

需要注意一下priority_queue比heap慢make_heap比pop_heap慢
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 using namespace std;
 8 const int MAXN=1000001;
 9 priority_queue<int>q;
10 void read(int & n)
11 {
12     char c=‘+‘;int x=0;int flag=0;
13     while(c<‘0‘||c>‘9‘)
14     {
15         c=getchar();
16         if(c==‘-‘)flag=1;
17     }
18
19     while(c>=‘0‘&&c<=‘9‘)
20         x=x*10+c-48,c=getchar();
21     if(flag==1)n=-x;
22     else n=x;
23 }
24 int n,tot;
25 int a[MAXN],b[MAXN],c[MAXN];
26 int main()
27 {
28     read(n);
29     for(int i=1;i<=n;i++)
30     read(a[i]);
31     for(int i=1;i<=n;i++)
32     read(b[i]);
33     for(int i=1;i<=n;i++)
34         c[i]=a[1]+b[i];
35     make_heap(c+1,c+n+1);
36     for(int i=2;i<=n;i++)
37     {
38         for(int j=1;j<=n;j++)
39         {
40             if(a[i]+b[j]<c[1])
41             {
42                 //q.push(a[i]+b[j]);
43                 c[1]=a[i]+b[j];
44                 pop_heap(c+1,c+n+1);
45             }
46             else break;
47         }
48     }
49     //priority_queue<int,vector<int>,greater<int> >p;
50     make_heap(c+1,c+n+1,greater<int>());
51     int k=n;
52     for(int i=1;i<=n;i++)
53     {
54         printf("%d ",c[1]);
55         pop_heap(c+1,c+1+k,greater<int>());
56         k--;
57     }
58     return 0;
59 }
 
时间: 2025-01-08 12:11:59

P1631 序列合并的相关文章

[洛谷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

【luogu】p1631 序列合并

题目链接www 仔细观察我们会发现以下规律 固定 A[i], 每 n 个和都是有序的: 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[2], -, A[n] + B[n] 分析 也就是说我们每次只需要考虑每一行的第一个还未计入答案的 我们建立一个小根堆,第一次先把每一行第一个数加入堆中 堆中记录加入的数 和这个数所在的行 每一次我们

Luogu P1631,2085 序列合并,最小函数值

Luogu P1631 序列合并 首先看下题目, 要求的是两个长度都是\(N\)的序列\(A\)和\(B\),在\(A\)和\(B\)中各取一个数相加可以得到\(N^2\)个和,这\(N^2\)个和中最小的\(N\)个. 看到由小到大输出,想出这有由优先队列和枚举解决的可能性,开始尝试 最简单的方式就是把每一个和都暴力塞进去,但是会妥妥的超时 接下来两种优化方法 第一种:选择性地塞进去 很容易想到将这两个数列变成 \(B_1+A_1,B_1+A_2,B_1+A_3,B_1+A_4 ... B_1

扩增子分析解读1质控 实验设计 双端序列合并

本文采用目前最主流的扩增子测序数据类型HiSeq2500 PE250类型数据为例,结合目前主流方法QIIME+USearch定制的分析流程.本课程中所需的测序数据.实验设计和课程分析生成的中间文件,均可以直去百度云下载.链接:http://pan.baidu.com/s/1hs1PXcw 密码:y33d 本课程代码的运行,至少需要Linux平台+安装QIIME 1 分析前准备 # 建立工作目录并进入,-p参数为如果文件夹存在不报错 mkdir -p example_PE250 cd exampl

求两个有序序列合并成新有序序列的中位数,求第k小数

此算法涉及一个重要数学结论:如果A[k/2-1]<B[k/2-1],那么A[0]~A[k/2-1]一定在第k小的数的序列当中,可以用反证法证明. 更加一般的结论是:k=pa+pb,如果A[pa-1]<B[pb-1],那么A[0]~A[pa-1]一定在第k小的数的序列当中. 算法思想如下: 1,假设A长度为m,B长度为n,m>n,反之亦然. 2,拆分k=pa+pb. 3,如果A[pa-1]<b[pb-1],那证明第A[0]~A[pa-1]一定在合并后k小数序列中.所以,可以把A的前面

将两个排好序的序列合并成一个(指针和数组分别实现)

1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 12 List

序列合并求前K小项 POJ2442

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 9 priority_queue<int>pq; 10 int an[3100]; 11 int bn[3100]; 12 13 int main() 14 { 15 int

序列合并 优先队列

题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N2N^2N2个和,求这N2N^2N2个和中最小的N个. 输入输出格式 输入格式: 第一行一个正整数N: 第二行N个整数AiA_iAi?, 满足Ai≤Ai+1A_i\le A_{i+1}Ai?≤Ai+1?且Ai≤109A_i\le 10^9Ai?≤109; 第三行N个整数BiB_iBi?, 满足Bi≤Bi+1B_i\le B_{i+1}Bi?≤Bi+1?且Bi≤109B_i\le 10^9Bi?≤109. [数据规模] 对于

序列合并

题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个. 输入输出格式 输入格式: 第一行一个正整数N: 第二行N个整数A_i, 满足Ai?≤Ai+1?且Ai?≤10^9; 第三行N个整数B_i, 满足Bi?≤Bi+1?且Bi?≤10^9. [数据规模] 对于50%的数据中,满足1<=N<=1000: 对于100%的数据中,满足1<=N<=100000. 输出格式: 输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数