CF 255 DIV2 D DZY Loves Modification(优先队列)

来源:互联网 发布:网络社交媒体 编辑:程序博客网 时间:2024/06/06 01:19

给你一个NXM的矩阵,进行K次操作,给你一个P

每次操作:选取某行(列) ans+= 该行(列)的和   该行(列)所有元素-P

我之前一直以为可以用线段树做, 一直WA  我还以为是我的线段树没写对

最后才知道原来根本就不能用线段树做。。。

预处理 i次选择行,行的总值为r【i】,同理去处理列

最终的ans= r[i] + c[k-i] - i*(k-i)*p;

代码:

#include <cstdio>#include <queue>using namespace std;#define maxn 1000#define LL long long#define maxk 1000000LL num[maxn+5][maxn+5];LL r[maxk+5] , c[maxk+5];int main(){LL n, m, k, p;while(scanf("%lld %lld %lld %lld",&n,&m,&k,&p)!=EOF){for(LL i= 1; i<= n; i++)for(LL j= 1; j<= m; j++)scanf("%lld",&num[i][j]);priority_queue<LL> q1, q2;for(LL i= 1; i<= n; i++){LL sum= 0;for(LL j= 1; j<= m; j++)sum+= num[i][j];q1.push(sum);}for(LL j= 1; j<= m; j++){LL sum= 0;for(LL i= 1; i<= n; i++)sum+= num[i][j];q2.push(sum);}r[0]= 0;c[0]= 0;for(LL i= 1; i<= k; i++){LL t= q1.top();r[i]= r[i-1] + t;q1.pop();q1.push(t- m*p);t= q2.top();c[i]= c[i-1]+ t;q2.pop();q2.push(t- n*p);}LL ans= c[k];for(LL i= 1; i<= k; i++){LL s= r[i] + c[k-i] - i*(k-i)*p;if(s> ans)ans= s;}printf("%lld\n",ans);}return 0;}


 

 

0 0