1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include<bits/stdc++.h> using namespace std; #define maxn 90005 #define ll long long
ll dui[maxn],len=0,n,m,k,ans[maxn]; ll b[maxn],a[maxn];
void down(int x) { int l = x*2; while(l<=len) { if(l<len&&dui[l]<dui[l+1]) l++; if(dui[l] > dui[x]) { swap(dui[l],dui[x]); x=l;l=x*2; } else break; } }
void up(int x) { while(x>1) { if(dui[x]>dui[x/2]) { swap(dui[x],dui[x/2]); x/=2; } else break; } }
void gettop(int val) { dui[1]=val; down(1); }
void add(int val) { dui[++len]=val; up(len); }
int main() { scanf("%lld%lld%lld",&n,&m,&k); for(int i=1;i<=m;i++) scanf("%lld",&b[i]); sort(b+1,b+1+m); for(int i=2;i<=n;i++) { for(int j=1;j<=m;j++) scanf("%lld",&a[j]); sort(a+1,a+1+m); memset(dui,0,sizeof(dui)); len=0; for(int j=1;j<=k;j++) add(b[1]+a[j]); for(int j=2;j<=k;j++) { if(b[j]+a[1]>=dui[1]) break; else for(int l=1;l<=k;l++) { if(b[j]+a[l]<dui[1]) gettop(b[j]+a[l]); else break; } } sort(dui+1,dui+1+len); for(int j=1;j<=len;j++) b[j]=dui[j]; } for(int i=1;i<=len;i++) printf("%lld ",b[i]); return 0; }
|