Description

Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of sequences. Then we can calculate the sum of numbers in each sequence, and get n ^ m values. What we need is the smallest n sums. Could you help us?
Input

The first line is an integer T, which shows the number of test cases, and then T test cases follow. The first line of each case contains two integers m, n (0 < m <= 100, 0 < n <= 2000). The following m lines indicate the m sequence respectively. No integer in the sequence is greater than 10000.
Output

For each test case, print a line with the smallest n sums in increasing order, which is separated by a space.
Sample Input

1
2 3
1 2 3
2 2 3
Sample Output

3 3 4

题意:有m行数字,每行均有n个数字.从每行均取出一个数字相加,共有m^n个解,输出解最小的n个.

题解:建一个大根堆,先将第一行的全部扔进去,在全部扔回一个数组里,那么此时数组中的数是从大到小排列的.

然后这个数组,我们给它中的每一个数取出,再加上第二行的第一个数,全部扔进堆里,接着对于第2~n个数中的每一个,我们将它与数组中最小的,次小的……(数组倒过来)相加,如果和比大根堆的堆顶大,这就是我们要找的了,将堆顶弹出,将这个值插入.然而我并不知道这玩意的复杂度,居然就这么A了?真是奇怪,有信仰的话可一定要用手写堆啊!

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define hi puts("hi");
using namespace std; int map[][]; struct Heap
{
int a[],sz; void init()
{
sz=;
} void add(int x)
{
int now=sz++;
while(now>)
{
int fa=now>>;
if(a[fa]>x)
{
break;
}
a[now]=a[fa];
now=fa;
}
a[now]=x;
} int pop()
{
int ans=a[];
int now=;
int x=a[--sz];
while((now<<)<sz)
{
int ls=now<<,rs=now<<|;
if(a[ls]<a[rs]&&rs<sz)
{
ls=rs;
}
if(a[ls]<x)
{
break;
}
a[now]=a[ls];
now=ls;
}
a[now]=x;
return ans;
} int top()
{
return a[];
} int empty()
{
return sz==;
}
} heap; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int m,n,b[],cnt=;
heap.init();
scanf("%d%d",&m,&n); for(int i=; i<=m; i++)
{
for(int j=; j<=n; j++)
{
scanf("%d",&map[i][j]);
}
}
for(int i=; i<=n; i++)
{
heap.add(map[][i]);
}
for(int i=; i<=m; i++)
{
cnt=;
while(!heap.empty())
{
b[++cnt]=heap.pop();
}
for(int j=; j<=cnt; j++)
{
heap.add(b[j]+map[i][]);
}
for(int j=; j<=n; j++)
{
for(int k=cnt; k>=; k--)
{
if(b[k]+map[i][j]<heap.top())
{
heap.pop();
heap.add(b[k]+map[i][j]);
}
else
{
break;
}
}
}
}
cnt=;
while(!heap.empty())
{
b[++cnt]=heap.pop();
}
for(int i=cnt; i>=; i--)
{
printf("%d ",b[i]);
}
printf("%d\n",b[]);
} }

POJ2442 Sequence(堆的骚操作)的更多相关文章

  1. $POJ2442\ Sequence$ 堆

    正解:堆 解题报告: 传送门$QwQ$ 全场除了我都切了系列$kk$ 首先看$n=2$的情况. 首先暴力不说?就记录一个$sum$再分别记录$xy$两维的下标存到堆里面每次取队头并继续扩展就完事$Qw ...

  2. C#中的9个“黑魔法”与“骚操作”

    C#中的9个"黑魔法"与"骚操作" 我们知道C#是非常先进的语言,因为是它很有远见的"语法糖".这些"语法糖"有时过于好 ...

  3. Typescript骚操作,在TS里面直接插入HTML

    Typescript骚操作,在TS里面直接插入HTML,还有语法提示 先给大家看一个图 因为我不喜欢用很重的框架,主要是并非专业UI,但是偶尔会用到,还是觉得直接element组装受不了,想想能在ts ...

  4. 闪电侠 Netty 小册里的骚操作

    前言 即使这是一本小册,但基于"不提笔不读书"的理念,仍然有必要总结一下.此小册对于那些"硬杠 Netty 源码 却不曾在千万级生产环境上使用实操"的用户非常有 ...

  5. awk骚操作

    一.awk自加 [root@168web3 ~]# head /data/logs/cloud_monitor_rds_cpu.log |awk '{sum+=$NF}END{print sum}' ...

  6. 如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)

    0x01 问题提出 还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如 ...

  7. UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)

    题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...

  8. 关于map 及 map 骚操作

    关于map这个东西   很冷门..................   但是,这个博客带你稍微了解一下map:   map用法:一般当作一个下表无穷大的数组   关于它的骚操作:map的鬼畜用法,可以 ...

  9. 通过HTTP的HEADER完成各种骚操作

    作为一名专业的切图工程师,我从来不care网页的header,最多关心Status Code是不是200.但是HEADER真的很重要啊,客户端从服务器端获取内容,首先就是通过HEADER进行各种沟通! ...

随机推荐

  1. (转)Android 50道面试题总结(大家看看吧)

    1. 方法重载与覆盖的区别?(Overload与Override的区别)2. String 和StringBuffer的区别3. 字符串“abcde”通过写一个函数不让调用第三方的字符串,实现一个字符 ...

  2. Spring:基于注解的Spring MVC

    什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...

  3. nodejs 中的 NODE_PATH

    在使用 nodejs 开发中我们都免不了要去安装一些第三方模块. 那么你或多或少的遇到过以下一些问题 再继续阅读之前,我们先来弄清楚一个概念. npm install --global xxx 属于全 ...

  4. java代码把字母转换大小写、、、、

    总结:从键盘输入多少次,就用for循环控制.这些需要输入的数据都放在循环内部,否则不会执行多次. package com.aaa; import java.util.Scanner; //大小写字母的 ...

  5. STM32使用printf丢失第一个字母的问题

    STM32使用printf函数给串口打印信息的执行步骤为: 1.重定向printf函数 给uart.c文件中增加如下函数: //重定向c库函数printf到USART1 int fputc(int c ...

  6. JavaScript笔记——基础知识(二)

    Function类型 函数function不需要返回类型(不是没有返回值),参数也不需要指定类型,更为特殊的是函数竟然是个类,可以通过new出来 var box= new Function('num1 ...

  7. Python字符串笔录

    python字符串操作实方法,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等 1.去空格及特殊符号 >>> s = '123 ...

  8. XML注释与Description标签及Java:注解(Annotation)的关系

    NET中的规范标准注释(一) -- XML注释标签讲解 一.摘要 .Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用. C#解析器可以把代码文件中的这些XML标记提取出来 ...

  9. 有关DNS

    单位的域控制器和下面客户端的连接一直有问题,时常会找不到服务器连接: 错误基本显示为:没有可以登录的服务器 无法连接seed.com域 后来发现,是DNS解析的问题,单位使用了外部解析地址202.96 ...

  10. aop计算方法耗时

    package necs.omms.common.aop; import lombok.extern.apachecommons.CommonsLog;import org.apache.common ...