浅谈堆: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. CAFFE学习笔记(三)在VS2013下生成需要的exe文件

    如我们所知,CAFFE_ROOT下有一个文件夹叫tools,里面中有许多cpp文件,它们各自有其不同的功能.但是很显然,当我们要完成某样工作时,我们是不能直接用cpp文件的,只能用exe文件.如何利用 ...

  2. iOS设备获取总结

    1.获取iOS设备的各种信息 // 这个方法后面会列出来 NSString *deviceName = [self getDeviceName]; NSLog(@"设备型号-->%@& ...

  3. [php][随机数]曲线式的随机

    数学函数原型: y = max / (x ^ 2) 函数图像(来自google): y = 100 / x ^ (-2) 其中y为随机结果,max为最大值且max>1,x为随机数, 两个参数: ...

  4. 《编程导论(Java)&#183;1.1.2 颠倒的世界(柏拉图法则)》

    假设你读<编程导论(Java)·1.1.2 颠倒的世界(柏拉图法则)>感到无趣,请尝试评价这个段子. 3. Classes Classes drive me crazy. That mig ...

  5. JVM垃圾回收时的可触及性

    可触及的 1.从根节点可以触及到这个对象可复活的 1.一旦所有引用被释放,就是可复活状态 2.因为在finalize()中可能复活该对象不可触及的 1.在finalize()后,可能会进入不可触及状态 ...

  6. Linux c编程:同步属性

    就像线程具有属性一样,线程的同步对象(如互斥量.读写锁.条件变量.自旋锁和屏障)也有属性 1.互斥量属性 用pthread_mutexattr_init初始化pthread_mutexattr_t结构 ...

  7. oracle decode的用法

    需求:分别统计emp表中1980,1981,1982,1987年入职的同事的数量. 这里用decode很容易就解决了: select sum(t.num_1980) as "1980&quo ...

  8. python3 批量缩放图片为iphone5的640*1136以下

    try: from PIL import Image, ImageDraw, ImageFont, ImageEnhance except ImportError: import Image, Ima ...

  9. 小程序获取openid和unionid java实现

    官方api:https://developers.weixin.qq.com/miniprogram/dev/api/api-login.html#wxloginobject 参考文章:https:/ ...

  10. 2个canvas叠加运用(时钟例子)

    最近在学习canvas,http://corehtml5canvas.com/code-live/,主要的学习方式就是通过上面的一些例子来学习canvas的一些用法.但是我发现,这里的例子,只要can ...