浅谈堆: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)\)

代码如下:

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int maxn=2e3+5;
  5. int n,m;
  6. int num1[maxn],num2[maxn],tmp[maxn];
  7. int read() {
  8. int x=0,f=1;char ch=getchar();
  9. for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
  10. for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
  11. return x*f;
  12. }
  13. struct node {
  14. bool bo;
  15. int x,y;
  16. node() {}
  17. node(int _x,int _y,bool _bo) {
  18. x=_x,y=_y,bo=_bo;
  19. }
  20. bool operator<(const node &a)const {
  21. return num1[x]+num2[y]<num1[a.x]+num2[a.y];
  22. }
  23. };
  24. struct Heap {
  25. int tot;
  26. node tree[maxn];
  27. void ins(node v) {
  28. tree[++tot]=v;
  29. int pos=tot;
  30. while(pos>1) {
  31. if(tree[pos]<tree[pos>>1])
  32. swap(tree[pos],tree[pos>>1]),pos>>=1;
  33. else break;
  34. }
  35. }
  36. node pop() {
  37. node res=tree[1];
  38. tree[1]=tree[tot--];
  39. int pos=1,son=2;
  40. while(son<=tot) {
  41. if(son<tot&&tree[son|1]<tree[son])son|=1;
  42. if(tree[son]<tree[pos])
  43. swap(tree[son],tree[pos]),pos=son,son=pos<<1;
  44. else break;
  45. }
  46. return res;
  47. }
  48. }T;
  49. int main() {
  50. int TEST=read();
  51. while(TEST--) {
  52. m=read(),n=read();
  53. for(int i=1;i<=n;i++)
  54. num1[i]=read();
  55. sort(num1+1,num1+n+1);
  56. for(int i=1;i<m;i++) {
  57. for(int j=1;j<=n;j++)
  58. num2[j]=read();
  59. sort(num2+1,num2+n+1);T.tot=0;
  60. int cnt=0;T.ins(node(1,1,0));
  61. for(int j=1;j<=n;j++) {
  62. node res=T.pop();
  63. tmp[++cnt]=num1[res.x]+num2[res.y];
  64. T.ins(node(res.x,res.y+1,1));
  65. if(!res.bo)T.ins(node(res.x+1,res.y,0));
  66. }
  67. for(int j=1;j<=n;j++)
  68. num1[j]=tmp[j];
  69. }
  70. for(int i=1;i<=n;i++)
  71. printf("%d ",num1[i]);
  72. puts("");
  73. }
  74. return 0;
  75. }

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. Android 新建一个类,在src新建一个类,使继承自活动

    一:先新建一个包 右键src,新建包: 二:包中新建类 右建包,新建类,将超类改为andorid.app.Activity

  2. SuperAgent使用文档

    SuperAgent是一个轻量级.灵活的.易读的.低学习曲线的客户端请求代理模块,使用在NodeJS环境中.官方文档:http://visionmedia.github.io/superagent 简 ...

  3. ArcGIS API for JavaScript Bookmarks(书签)

    说明:本篇博文介绍的是ArcGIS API for JavaScript中的 Bookmarks(书签) ,书签的作用是,把地图放大到一个地方 添加书签,书签名称可以和地图名称一直,单击标签 地图会定 ...

  4. Iptalbes练习题(二)

    接着上节,上节课,基本功能设置后,现在我们telnet本机一下,发现问题: [root@test1 ~]# telnet Trying 127.0.0.1... telnet: connect to ...

  5. 基于事件驱动的前端通信框架(封装socket.io)

    socket.io的使用可以很轻松的实现websockets,兼容所有浏览器,提供实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验.但是在使用socket.io的过程中,由于业务需求需要同 ...

  6. P2487 [SDOI2011]拦截导弹

    题目 P2487 [SDOI2011]拦截导弹 做\(SDOI\)有种想评黑的感觉,果然还是太弱了 做法 独立写(调)代码三个小时祭 简化题目:求二维最长不上升子序列及每个点出现在最长不上升子序列概率 ...

  7. 使用 Apache poi 导入Excel

    本文主要记录Excel导入及模板下载,遇到的问题及注意事项. 第一节:Excel导入   1.如何获取Excel中的最大行,也就是最后一行? 2.如何获取有效行?有效行的定义是每一行记录中每一列中值都 ...

  8. ios 微信发送位置

    @interface GroupReportViewController () <BMKMapViewDelegate,BMKLocationServiceDelegate,BMKGeoCode ...

  9. Nginx/Apache下如何禁止指定目录运行PHP脚本

    下面和大家一起分享下如何在Apache和Nginx禁止上传目录里PHP的执行权限. Apache下禁止指定目录运行PHP脚本 在虚拟主机配置文件中增加php_flag engine off指令即可,配 ...

  10. lnmp 一键安装配置

    l系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin Server/Aliyun/Amazon/Mint Linux发行版 需要5GB以上硬盘 ...