As we know, DZY loves playing games. One day DZY decided to play with a n × m matrix. To be more precise, he decided to modify the matrix with exactly k operations.ios
Each modification is one of the following:git
DZY wants to know: what is the largest total value of pleasure he could get after performing exactly k modifications? Please, help him to calculate this value.ide
The first line contains four space-separated integers n, m, k and p (1 ≤ n, m ≤ 103; 1 ≤ k ≤ 106; 1 ≤ p ≤ 100).this
Then n lines follow. Each of them contains m integers representing aij (1 ≤ aij ≤ 103) — the elements of the current row of the matrix.spa
Output a single integer — the maximum possible total pleasure value DZY could get.orm
2 2 2 2
1 3
2 4
11
2 2 5 2
1 3
2 4
11
For the first sample test, we can modify: column 2, row 2. After that the matrix becomes:blog
1 1
0 0
For the second sample test, we can modify: column 2, row 2, row 1, column 1, column 2. After that the matrix becomes:ip
-3 -3
-2 -2
貌似行和列不太好處理?
假設先對行進行處理了 i 次,那麼列天然就是 k-i 次處理;
對行操做結束後: sum-=m*p*i;
此時對列的就是 -= (k-i)*p*i;
那麼咱們枚舉行和列的操做次數便可;
#include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<queue> #include<bitset> #include<ctime> #include<deque> #include<stack> #include<functional> #include<sstream> //#include<cctype> //#pragma GCC optimize(2) using namespace std; #define maxn 2000005 #define inf 0x7fffffff //#define INF 1e18 #define rdint(x) scanf("%d",&x) #define rdllt(x) scanf("%lld",&x) #define rdult(x) scanf("%lu",&x) #define rdlf(x) scanf("%lf",&x) #define rdstr(x) scanf("%s",x) typedef long long ll; typedef unsigned long long ull; typedef unsigned int U; #define ms(x) memset((x),0,sizeof(x)) const long long int mod = 1e9 + 7; #define Mod 1000000000 #define sq(x) (x)*(x) #define eps 1e-3 typedef pair<int, int> pii; #define pi acos(-1.0) //const int N = 1005; #define REP(i,n) for(int i=0;i<(n);i++) typedef pair<int, int> pii; inline ll rd() { ll x = 0; char c = getchar(); bool f = false; while (!isdigit(c)) { if (c == '-') f = true; c = getchar(); } while (isdigit(c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return f ? -x : x; } ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b); } ll sqr(ll x) { return x * x; } /*ll ans; ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ans = exgcd(b, a%b, x, y); ll t = x; x = y; y = t - a / b * y; return ans; } */ priority_queue<ll>r, c; ll n, m; ll maxc[maxn], maxr[maxn]; ll a[2000][2000]; int main() { //ios::sync_with_stdio(0); ll k, p; cin >> n >> m >> k >> p; ll sumr = 0, sumc = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { rdllt(a[i][j]); sumr += a[i][j]; } r.push(sumr); sumr = 0; } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { sumc += a[j][i]; } c.push(sumc); sumc = 0; } ll maxx = -1e17 - 4; for (int i = 1; i <= k; i++) { ll tmp = r.top(); r.pop(); maxr[i] = maxr[i - 1] + tmp; r.push(tmp - m * p); } for (int i = 1; i <= k; i++) { ll tmp = c.top(); c.pop(); maxc[i] = maxc[i - 1] + tmp; c.push(tmp - n * p); } for (int i = 0; i <= k; i++) { ll ans = maxc[i] + maxr[k - i] - (ll)i*(k - i)*p; maxx = max(maxx, ans); } cout << maxx << endl; return 0; }