P1631 序列合并 洛谷】的更多相关文章

https://www.luogu.org/problem/show?pid=1631 题目描述 有两个长度都是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<…
P1631 序列合并 236通过 657提交 题目提供者xmyzwls 标签堆 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 为什么不行? 题目描述 有两个长度都是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<…
P1631 序列合并 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2N2个和,求这N^2N2个和中最小的N个. 对于100%的数据中,满足1<=N<=100000. 思路巧妙,直接看代码 #include <cstdio> #include <algorithm> #include <iostream> #include <queue> #include <cstring> #include <algori…
https://www.luogu.org/problemnew/show/P1631 序列a中每个数首先都和序列b中的最小元素配对(虽然好像不是很必要这么早插进来?) 每次从堆顶取出最小的和输出答案,然后尝试为这个ai配对下一个bj,要是没有的话--说明都是他一个人贡献完了. #include<bits/stdc++.h> using namespace std; typedef long long ll; int n; int a[100005]; int b[100005]; struc…
博主学习本题的经过嘤嘤嘤: 7.22 : 听学长讲(一知半解)--自己推(推不出来)--网上看题解--以为自己会了(网上题解是错的)--发现错误以后又自己推(没推出来)--给学长发邮件--得到正确解法--按着学长思路又推一遍--最后理解 (前后的"学长"不是同一个人) 7.23 : 写出代码,完善细节. (建议改成:西   天   取   经) 首先,网上对于这道题的题解绝大部分是错误的!(比如洛谷上的部分题解) 用LIS做是不行的 玄学贪心是不行的 dp转移方程不能自圆其说是不行的…
题意简述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个. 题解思路 大根堆,先存入n个和,再比较大小,改变堆中元素. 代码 #include <cstdio> #include <algorithm> using namespace std; int n, a[100001], b[100001], ans[100001]; int cnt, heap[100001]; void up(int x); void down(in…
传送门 解题思路 首先读入a.b数组后,sort一遍(从小到大),然后把a[1]+b[1],a[2]+b[1],a[3]+b[1]……a[n]+b[1]全部加入一个优先队列q(小根堆). 然后从一到n循环,每一次取出队列中的最小的元素(假设是a[i]+b[j]),输出数值,然后把数值修改为a[i]+b[j+1],存入队列. 为什么呢? 很显然,我们把所有可能的情况列成一张表: a[1]+b[1],a[2]+b[1],a[3]+b[1],……,a[n]+b[1]; a[1]+b[2],a[2]+b…
记一下:线段树占空间是$2^{ceil(log2(n))+1}$ 这个就是一个线段树区间操作题,各种标记的设置.转移都很明确,只要熟悉这类题应该说是没有什么难度的. 由于对某区间set之后该区间原先待进行的取反操作失效(被覆盖),因此规定tag同时存在时set的标记先进行操作,这样对区间加上set标记时要去掉原有的取反标记. 对于操作4,线段树上每个区间维护6个值,分别表示:该区间最多的连续0/1,从左侧数起/从右侧数起/其中任意位置.题目中不问连续0,为什么连续0也要维护呢?这是为了在进行取反…
题目 开一个堆,先把所有\(a[i]+b[1]\)压进优先队列. 然后每次把最小的取出来,把对应的\(a[i]\)的下一个\(b[j]\)拿出来加进去. #include<bits/stdc++.h> using namespace std; namespace IO { char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[15],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21); inline char Get…
P1631 序列合并 题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N2个和,求这N2个和中最小的N个. 输入输出格式 输入格式: 第一行一个正整数N: 第二行N个整数Ai​, 满足Ai​≤Ai+1​且Ai​≤109; 第三行N个整数Bi​, 满足Bi​≤Bi+1​且Bi​≤109. 输出格式: 输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开. 输入输出样例 输入样例#1: 复制 3 2 6 6 1 4 8 输出样例#1: 复制 3 6 7…