本题要维护两个大根堆,用来循环维护。。。注意STL heap里的复杂度
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
using namespace std;
int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
#define LL long long
#define PI acos(-1.0)
#define N 2010
#define MAX INT_MAX
#define MIN INT_MIN
#define eps 1e-8
#define FRE freopen("a.txt","r",stdin)
int a[N],b[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
int i,j,k;
for(i=0;i<m;i++)
scanf("%d",&a[i]);
make_heap(a,a+m);//复杂度O(n)
int num;
for(i=1;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&num);
if(i&1){
if(j==0){
for(k=0;k<m;k++){
b[k]=a[k]+num;
}
}
else{
for(k=0;k<m;k++){
if(num+a[k]<b[0]){
pop_heap(b,b+m);//复杂度O(log(n))
b[m-1]=num+a[k];
push_heap(b,b+m);//把b[m-1]推进去堆里再做成一个堆,复杂度O(log(n))
}
}
}
}
else{
if(j==0){
for(k=0;k<m;k++){
a[k]=b[k]+num;
}
}
else{
for(k=0;k<m;k++){
if(num+b[k]<a[0]){
pop_heap(a,a+m);
a[m-1]=num+b[k];
push_heap(a,a+m);
}
}
}
}
}
}
if(!(n&1)){
sort(b,b+m);
for(i=0;i<m;i++)
printf("%d ",b[i]);
puts("");
}
else{
sort(a,a+m);
for(i=0;i<m;i++)
printf("%d ",a[i]);
puts("");
}
}
return 0;
}

本文介绍了一种使用两个大根堆进行数据维护的算法实现,该算法通过不断调整堆结构来确保数据的有效处理。适用于需要频繁更新并维持一定顺序的数据集合场景。
894

被折叠的 条评论
为什么被折叠?



