CF 446B DZY Loves Modification 优先队列

来源:互联网 发布:js遍历对象数组并替换 编辑:程序博客网 时间:2024/06/14 17:23

题目链接:这里
题意:
有一个n*m的矩阵,你需要操作k次,每次操作是选择一行或者一列,使得ans+=这一行或者这一列的和
然后再使得这一行或者这一列的数全部减去p
现在问你他操作k次之后,最多获得多少分数

解法:
假设你最后操作了k次,那么对于整体的答案,你需要减去i*(k-i)*p这么多(重复的点)
这样我们就把p给处理出来了
现在我们再把行和列都分开,然后用一个优先队列去处理就好了
然后这道题就结束了……

//490 E#include <bits/stdc++.h>using namespace std;const int maxn = 1100;long long dp1[maxn*maxn], dp2[maxn*maxn], row[maxn*maxn], col[maxn*maxn], a[maxn][maxn];priority_queue <long long> q1, q2;int n, m, k;long long p;int main(){    scanf("%d%d%d%I64d", &n, &m, &k, &p);    for(int i = 0; i < n; i++){        for(int j = 0; j < m; j++){            scanf("%Id", &a[i][j]);            row[i] += a[i][j];            col[j] += a[i][j];        }    }    while(!q1.empty()) q1.pop();    while(!q2.empty()) q2.pop();    for(int i = 0; i < n; i++) q1.push(row[i]);    for(int i = 0; i < m; i++) q2.push(col[i]);    dp1[0] = dp2[0] = 0;    for(int i = 1; i <= k; i++){        long long x1 = q1.top(); q1.pop();        long long x2 = q2.top(); q2.pop();        dp1[i] = dp1[i-1] + x1;        dp2[i] = dp2[i-1] + x2;        q1.push(x1 - 1LL*p*m);        q2.push(x2 - 1LL*p*n);    }    long long ans = dp1[0] + dp2[k];    for(int i = 1; i <= k; i++){        ans = max(ans, dp1[i] + dp2[k-i] - 1LL*i*(k-i)*p);    }    printf("%I64d\n", ans);    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3个月的婴儿鼻塞怎么办 四个月宝宝感冒鼻塞严重怎么办 4个月小孩鼻塞怎么办 4个多月的宝宝流鼻涕怎么办 4个月大的宝宝流鼻涕怎么办 两岁宝宝着凉了怎么办 7岁儿童晚上鼻塞怎么办 儿童感冒鼻塞怎么办速效办法 7岁儿童感冒鼻塞怎么办 七个月婴儿感冒流鼻涕怎么办 婴儿感冒流鼻涕怎么办速效办法 三个月婴儿感冒咳嗽流鼻涕怎么办 五个月婴儿感冒咳嗽流鼻涕怎么办 两个多月的宝宝鼻塞怎么办 3个月宝宝感冒鼻塞怎么办 2个月宝宝感冒鼻塞怎么办 5个月宝宝鼻塞怎么办 6个月宝宝鼻塞怎么办 3个月婴儿感冒咳嗽怎么办 感冒打喷嚏打不出来怎么办 4岁宝宝体温37.5怎么办 8个月的宝宝鼻塞怎么办 4个月婴儿鼻塞怎么办 我一躺下就鼻塞怎么办 感冒了鼻子堵了怎么办 感冒鼻涕流的多怎么办 小孩感冒鼻塞怎么办最简单方法 鼻子痒老打喷嚏流鼻涕怎么办 眼睛红痒鼻子流鼻涕怎么办 19个月宝宝流鼻血怎么办 9个月宝宝流鼻血怎么办 8个月宝宝流鼻血怎么办 4个月宝宝流鼻血怎么办 20个月宝宝发烧流鼻血怎么办 60天宝宝老鼻塞怎么办 10个月宝宝头被撞到流鼻血怎么办 狗狗受凉吐了怎么办 狗狗咳嗽流鼻涕一直不好怎么办 宝宝感冒咳嗽流鼻涕发烧怎么办 狗狗感冒咳嗽流鼻涕怎么办 9岁儿童咳嗽鼻塞怎么办