ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】 洛谷 P1631 序列合并

2022-07-23 17:36:01  阅读:110  来源: 互联网

标签:偏序 dots node 洛谷 int 题解 元素 long P1631


这个题提供给了我们一个比较新颖的思考方向:

发现由所有的和可以组成这样的 \(n\) 个偏序集:

\[\{a_1+b_1,a_1+b_2 \dots a_1+b_n\} \]

\[\{a_2+b_1,a_2+b_2 \dots a_2+b_n\} \]

\[\dots \]

\[\{a_n+b_1,a_n+b_2 \dots a_n+b_n\} \]

然后我们可以考虑把每个偏序集中最小的元素加入一个优先队列中,也就是 \(a_1+b_1,a_2+b_1\dots a_n+b_1\),然后每取出一个 \(a_i+b_j\),就将该偏序集中次小的那个元素(即\(a_i+b_{i+1}\))加入优先队列中(前提是 \(i<n\)),这样求满 \(n\) 个,即为前 \(n\) 小。

正确性证明:

加入偏序集元素的顺序使得我们能保证当前加入的元素是该偏序集中最小的,而优先队列又能保证每次取出的元素是 \(n\) 个偏序集中未取的最小的元素中最小的,所以正确性得证。


#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;
}

标签:偏序,dots,node,洛谷,int,题解,元素,long,P1631
来源: https://www.cnblogs.com/wapmhac0523/p/16512499.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有