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
|
#include <bits/stdc++.h> #define int long long #define Go(i , x , y) for(register int i = x; i <= y; i++) #define God(i , y , x) for(register int i = y; i >= x; i--)
const int N = 1000 + 10; int n , m , a[N][N] , k , p , ansrow[N*N] , anscol[N*N]; std::priority_queue <int> q1; signed main() { scanf("%I64d%I64d%I64d%I64d" , &n , &m , &k , &p); Go(i , 1 , n) Go(j , 1 , m) scanf("%I64d" , &a[i][j]);
Go(i , 1 , n) { int sum = 0; Go(j , 1 , m) sum += a[i][j]; q1.push(sum); }
Go(i , 1 , k) { int x = q1.top(); q1.pop(); ansrow[i] = ansrow[i - 1] + x; q1.push(x - m * p); }
while(!q1.empty()) q1.pop();
Go(j , 1 , m) { int sum = 0; Go(i , 1 , n) sum += a[i][j]; q1.push(sum); }
Go(i , 1 , k) { int x = q1.top(); q1.pop(); anscol[i] = anscol[i - 1] + x; q1.push(x - n * p); }
int ans = LLONG_MIN; Go(i , 0 , k) { int a = i , b = k - i; int total = a * b * p; ans = std::max(ans , ansrow[i] + anscol[k - i] - total); } std::cout << ans << std::endl; return 0; }
|