【题解】 洛谷 P1631 序列合并
这个题提供给了我们一个比较新颖的思考方向:
发现由所有的和可以组成这样的
然后我们可以考虑把每个偏序集中最小的元素加入一个优先队列中,也就是
正确性证明:
加入偏序集元素的顺序使得我们能保证当前加入的元素是该偏序集中最小的,而优先队列又能保证每次取出的元素是
#include<bits/stdc++.h>
#define ll long long
//#define int long long
#define lc(k) k<<1
#define rc(k) k<<1|1
const int MAX=1e5+10;
const int MOD=1e9+7;
using namespace std;
inline char readchar() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
}
inline int read() {
#define readchar getchar
int res = 0, f = 0;
char ch = readchar();
for(; !isdigit(ch); ch = readchar()) if(ch == '-') f = 1;
for(; isdigit(ch);ch = readchar()) res = (res << 1) + (res << 3) + (ch ^ '0');
return f ? -res : res;
}
inline void write(int x) {
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int a[MAX],b[MAX];
struct node
{
int id1,id2,w;
friend bool operator < (node x,node y)
{
return x.w>y.w;
}
};
priority_queue<node> q;
signed main()
{
int n=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) b[i]=read();
for(int i=1;i<=n;i++) q.push((node){i,1,a[i]+b[1]});
for(int i=1;i<=n;i++)
{
node ff=q.top();q.pop();
if(ff.id2<n) q.push((node){ff.id1,ff.id2+1,a[ff.id1]+b[ff.id2+1]});
write(ff.w);
putchar('\n');
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术