POJ2442:Sequence
浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html
题目传送门:http://poj.org/problem?id=2442
我们先简化题意,假设只有两行。
那么显然,最小值是a1+b1。并且次小值集合是a2+b1,a1+b2。
假设a1+b2是次小值,那么次次小值集合就是a2+b1,a2+b2,a1+b3。
也就是说,当ai+bj成为当前最小值之后,ai+1+bj,ai+bj+1将会进入当前集合的次小值集合。我们用堆维护一下,每次取出最小值再把扩展出来的两个数扔回去就行了。
但是,a2+b2显然是可以通过a1+b2和a2+b1扩展出来的,如果不去重的话显然状态是非常非常多的,那样空间时间都没法保证。
所以我们强行勒令ai+bj只能转移到ai+bj+1,前提是ai+bj是由ai+bj−1扩展来的。
也就是说,假设现在有两个指针分别在第一行和第二行上移动,对于ai+bj必须满足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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥