CF446B DZY Loves Modification 题解

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了CF446B DZY Loves Modification 题解脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Link.

Codeforces Luogu

Description.

给定 (ntimes m) 的矩阵,进行 (K) 次操作。 每次操作选定一行或一列,获得这行、列的和的价值,并把整行、列减去 (p)。 问 (K) 次操作后价值和最大值。

Nailve Solution.

胡了个假的贪心。

Solution.

发现无论选哪行,对列的贡献都是相同的,所以可以行列拆开。 发现行与列之间顺序是无关的,因为都是 (s_i+s_j-p),行和行、列和列之间也肯定无关。 所以只需要关心选了多少行、选了多少列就行了。 选多少行的贡献肯定是可以贪心计算的,直接用优先队列就行了。

Coding.

@H_360_29@点击查看代码
//是啊,你就是那只鬼了,所以被你碰到以后,就轮到我变成鬼了{{{
#include<bITs/stdc++.h>
using namespace std;tyPEdef long long ll;
template<typename T>inline void read(T &amp;x)
{
	x=0;char c=getchar(),f=0;
	for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1;
	for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	f?x=-x:x;
}
template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}}
int n,m;ll a[1005][1005],s1[1005],s2[1005],K,p,rs=-1e18;
PRiority_queue<int>q1,q2;ll v1[1000005],v2[1000005];
int main()
{
	read(n,m,K,p);for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) read(a[i][j]);
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) s1[i]+=a[i][j],s2[j]+=a[i][j];
	for(int i=1;i<=n;i++) q1.push(s1[i]);
	for(int i=1,v;i<=K;i++) v1[i]=v1[i-1]+(v=q1.top()),q1.pop(),q1.push(v-p*m);
	for(int i=1;i<=m;i++) q2.push(s2[i]);
	for(int i=1,v;i<=K;i++) v2[i]=v2[i-1]+(v=q2.top()),q2.pop(),q2.push(v-p*n);
	for(int i=0;i<=K;i++) rs=max(rs,v1[i]+v2[K-i]-p*i*(K-i));
	return printf("%lldn",rs),0;
}

脚本宝典总结

以上是脚本宝典为你收集整理的CF446B DZY Loves Modification 题解全部内容,希望文章能够帮你解决CF446B DZY Loves Modification 题解所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。