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.
Each modification is one of the following:
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.
The first line contains four space-separated integers n, m, k and p (1 ≤ n, m ≤ 103; 1 ≤ k ≤ 106; 1 ≤ p ≤ 100).
Then n lines follow. Each of them contains m integers representing aij (1 ≤ aij ≤ 103) — the elements of the current row of the matrix.
Output a single integer — the maximum possible total pleasure value DZY could get.
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:
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:
-3 -3 -2 -2
文章大意是给你一个n * m的矩阵,你能够进行k次操作.
操作1:把一行的每一个元素都减去p,你能够获得该行全部元素和(操作之前)的pleasure
操作2:把一列的每一个元素都减去p,你能够获得该列全部元素和(操作之前)的pleasure
问你最大能够获得的pleasure是多少
思路:枚举操作1所进行的次数,每次取能获得最大的行,用优先队列维护,要注意预处理,否则会超时
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> typedef long long LL; using namespace std; int A[1005][1005]; LL R[1005],C[1005]; LL s1[1000005],s2[1000005]; void get_C(int n,int i,int (*A) [1005]) { LL s=0; for(int j=1;j<=n;j++) s+=A[j][i]; C[i]=s; } void get_R(int m,int i,int (*A)[1005]) { LL s=0; for(int j=1;j<=m;j++) s+=A[i][j]; R[i]=s; } int main() { int n,m,k,p; while(scanf("%d%d%d%d",&n,&m,&k,&p)==4) { LL s=0; s1[0]=s2[0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&A[i][j]); LL sum=-1000000000000009; priority_queue<LL>q1; priority_queue<LL>q2; for(int i=1;i<=n;i++){get_R(m,i,A);q1.push(R[i]);} for(int i=1;i<=m;i++){get_C(n,i,A);q2.push(C[i]);} for(int j=1;j<=k;j++) { LL temp=q1.top(); q1.pop(); s1[j]=s1[j-1]+temp; temp-=p*m; q1.push(temp); } for(int j=1;j<=k;j++) { LL temp=q2.top(); q2.pop(); s2[j]=s2[j-1]+temp; temp-=p*n; q2.push(temp); } for(int i=0;i<=k;i++) { s=s1[i]+s2[k-i]; sum=max(sum,s-LL(i)*p*(k-i)); } printf("%I64d\n",sum); } return 0; }