浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html

题目传送门:http://poj.org/problem?id=2442

我们先简化题意,假设只有两行。

那么显然,最小值是\(a_1+b_1\)。并且次小值集合是\(a_2+b_1,a_1+b_2\)。

假设\(a_1+b_2\)是次小值,那么次次小值集合就是\(a_2+b_1,a_2+b_2,a_1+b_3\)。

也就是说,当\(a_i+b_j\)成为当前最小值之后,\(a_{i+1}+b_j,a_i+b_{j+1}\)将会进入当前集合的次小值集合。我们用堆维护一下,每次取出最小值再把扩展出来的两个数扔回去就行了。

但是,\(a_2+b_2\)显然是可以通过\(a_1+b_2\)和\(a_2+b_1\)扩展出来的,如果不去重的话显然状态是非常非常多的,那样空间时间都没法保证。

所以我们强行勒令\(a_i+b_j\)只能转移到\(a_i+b_{j+1}\),前提是\(a_i+b_j\)是由\(a_i+b_{j-1}\)扩展来的。

也就是说,假设现在有两个指针分别在第一行和第二行上移动,对于\(a_i+b_j\)必须满足\(i\)先移动\(j\)再移动然后到了这个地方。这样就不会有重复的状态了,也不会露掉中间值。

时间复杂度:\(O(mnlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=2e3+5; int n,m;
int num1[maxn],num2[maxn],tmp[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct node {
bool bo;
int x,y; node() {} node(int _x,int _y,bool _bo) {
x=_x,y=_y,bo=_bo;
} bool operator<(const node &a)const {
return num1[x]+num2[y]<num1[a.x]+num2[a.y];
}
}; struct Heap {
int tot;
node tree[maxn]; void ins(node v) {
tree[++tot]=v;
int pos=tot;
while(pos>1) {
if(tree[pos]<tree[pos>>1])
swap(tree[pos],tree[pos>>1]),pos>>=1;
else break;
}
} node pop() {
node res=tree[1];
tree[1]=tree[tot--];
int pos=1,son=2;
while(son<=tot) {
if(son<tot&&tree[son|1]<tree[son])son|=1;
if(tree[son]<tree[pos])
swap(tree[son],tree[pos]),pos=son,son=pos<<1;
else break;
}
return res;
}
}T; int main() {
int TEST=read();
while(TEST--) {
m=read(),n=read();
for(int i=1;i<=n;i++)
num1[i]=read();
sort(num1+1,num1+n+1);
for(int i=1;i<m;i++) {
for(int j=1;j<=n;j++)
num2[j]=read();
sort(num2+1,num2+n+1);T.tot=0;
int cnt=0;T.ins(node(1,1,0));
for(int j=1;j<=n;j++) {
node res=T.pop();
tmp[++cnt]=num1[res.x]+num2[res.y];
T.ins(node(res.x,res.y+1,1));
if(!res.bo)T.ins(node(res.x+1,res.y,0));
}
for(int j=1;j<=n;j++)
num1[j]=tmp[j];
}
for(int i=1;i<=n;i++)
printf("%d ",num1[i]);
puts("");
}
return 0;
}

POJ2442:Sequence的更多相关文章

  1. Kafka高性能揭秘:sequence IO、PageCache、SendFile的应用详解

    大家都知道Kafka是将数据存储于磁盘的,而磁盘读写性能往往很差,但Kafka官方测试其数据读写速率能达到600M/s,那么为什么Kafka性能会这么高呢? 首先producer往broker发送消息 ...

  2. UVM序列篇之二:sequence和item(上)

    无论是自驾item,穿过sequencer交通站,通往终点driver,还是坐上sequence的大巴,一路沿途观光,最终跟随导游停靠到风景点driver,在介绍如何驾驶item和sequence,遵 ...

  3. HDU 5667 :Sequence

    Sequence  Accepts: 59  Submissions: 650  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536 ...

  4. Oracle:sequence问题研究

    一直以来,以为sequence是不间断地持续增长的:但今天发现sequence是会跳号,这种情况发生在RAC环境下.在单实例环境下,应该不存在的. sequence截图如下: 数据库表中发生了跳号: ...

  5. 序列:SEQUENCE

    一.序列介绍 Oracle的序列是一种数据库对象,主要作用是用来产生唯一值.序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享. 二.创建序列 序列使用CREATE SEQUENC ...

  6. HDU 5312:Sequence

    Sequence  Accepts: 25  Submissions: 1442  Time Limit: 2000/2000 MS (Java/Others)  Memory Limit: 2621 ...

  7. POJ3581:Sequence——题解

    http://poj.org/problem?id=3581 给一串数,将其分成三个区间并且颠倒这三个区间,使得新数列字典序最小. 参考:http://blog.csdn.net/libin56842 ...

  8. HDU - 6395:Sequence (分块+矩阵)

    题面太丑了,就不复制了. 题意:F1=A: F2=B: Fn=D*Fn-1+C*Fn-2+P/i:求Fn. 思路:根据P/i的值划分区间,每个区间矩阵求. 带常数的矩阵: #include<bi ...

  9. 九度OJ 1262:Sequence Construction puzzles(I)_构造全递增序列 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:118 解决:54 题目描述: 给定一个整数序列,请问如何去掉最少的元素使得原序列变成一个全递增的序列. 输入: 输入的第一行包括一个整数N( ...

随机推荐

  1. 重载(overload)、覆盖(override)和隐藏(hide)

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...

  2. D-hdu 1465 不容易系列之一(递推)

    hdu 1465 不容易系列之一(错排) 不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ( ...

  3. (转)深入理解Java内存模型之系列篇

    原文地址: http://blog.csdn.net/ccit0519/article/details/11241403 深入理解Java内存模型(一)——基础 并发编程模型的分类 在并发编程中,我们 ...

  4. POJ 2092 Grandpa is Famous【水---找出现第二多的数】

    链接: http://poj.org/problem?id=2092 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27454#probl ...

  5. 微信小程序报“app.json”错误解决办法

    1.亲测 “app.json未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译.” 是由于新创建的界面xxx.json所在的文件夹为0KB造成的,你可以试着在xxx.json文件内 ...

  6. [Android]彻底去除Google AdMob广告

    应用中包含广告是能够理解的,但经常造成用户误点,或者广告切换时造成下载流量,就有点让人不舒服了. 以下就以Google AdMob广告为例,看怎样彻底去除他. 先分析一下Google AdMob的工作 ...

  7. IE模式下背景图片不显示

    初衷是想给这个提交按钮<input type="submit" value=" />加上背景图片,用了以下css样式: .subtn input { back ...

  8. 10.Django数据库操作(增删改)

    插入数据 命令:create 或者 save create用法:ModelName.objects.create(itemName="itemValue") save用法:mode ...

  9. vim python缩进等一些配置

    VIM python下的一些关于缩进的设置: 第一步:  打开终端,在终端上输入vim ~/.vimrc,回车.  第二步:  添加下面的文段: set filetype=python au BufN ...

  10. spring-cloud 实现更新配置不用重启服务 @FreshScope

    继续前面搭建的spring cloud. 这里是基于rabbitMQ搭建的,首先需要在电脑上安装rabbitMQ. 在client端和server端分别加上如下依赖 compile group: 'o ...