diff --git a/P1631.cpp b/P1631.cpp new file mode 100644 index 0000000..4968442 --- /dev/null +++ b/P1631.cpp @@ -0,0 +1,26 @@ +#include +using namespace std; +int n; +int a[100005], b[100005]; +int main() { + scanf("%d", &n); + for (int i = 1; i <= n; ++i) { + scanf("%d", &a[i]); + } + for (int i = 1; i <= n; ++i) { + scanf("%d", &b[i]); + } + priority_queue>, vector>>, + greater>>> + q; + for (int i = 1; i <= n; ++i) + q.push({a[i] + b[1], {i, 1}}); + for (int i = 1; i <= n; ++i) { + printf("%d ", q.top().first); + auto t = q.top(); + q.pop(); + q.push({a[t.second.first] + b[t.second.second + 1], + {t.second.first, t.second.second + 1}}); + } + return 0; +} \ No newline at end of file diff --git a/P1631.md b/P1631.md new file mode 100644 index 0000000..cc5e79e --- /dev/null +++ b/P1631.md @@ -0,0 +1,39 @@ +# P1631 序列合并 + +## 题目描述 + +有两个长度为 $N$ 的**单调不降**序列 $A,B$,在 $A,B$ 中各取一个数相加可以得到 $N^2$ 个和,求这 $N^2$ 个和中最小的 $N$ 个。 + +## 输入格式 + +第一行一个正整数 $N$; + +第二行 $N$ 个整数 $A_{1\dots N}$。 + +第三行 $N$ 个整数 $B_{1\dots N}$。 + +## 输出格式 + +一行 $N$ 个整数,从小到大表示这 $N$ 个最小的和。 + +## 输入输出样例 #1 + +### 输入 #1 + +``` +3 +2 6 6 +1 4 8 +``` + +### 输出 #1 + +``` +3 6 7 +``` + +## 说明/提示 + +对于 $50\%$ 的数据,$N \le 10^3$。 + +对于 $100\%$ 的数据,$1 \le N \le 10^5$,$1 \le A_i,B_i \le 10^9$。 \ No newline at end of file