ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[CF446B]DZY Loves Modification 题解

2022-06-18 13:02:00  阅读:139  来源: 互联网

标签:const int 题解 d% times Modification maxn maxm DZY


传送门QAQ

Preface

很不错的一道题,学到了遇到瓶颈时思考的方法。

Analysis

首先要发现一个东西:行上的操作对所有列的影响是等效的,列同理。

那么就有了一个朴素的贪心思路:用优先队列求出当前和最大的行或列,处理一下答案。

但稍微想一下就能发现,如果有大小相同的行和列,那就相当不好搞了。

一开始我想着判断一下 \(n,m\) 的大小关系就行,然后果不其然 WA on #4

这时就要开发一点新思路了。

我们会发现,其实先选行,再选列与先选列,再选行没有任何区别。

因为它们产生的影响始终会作用在对方身上。

具体的,如果选了 \(i\) 个行和 \(k-i\) 个列,总会产生 \(i \times (k - i) \times p\) 的影响。

那么我们就珂以参考上面的思路,将行列分开贪心处理。

令 \(L_i\) 为选了 \(i\) 行的贡献,\(R_i\) 为选了 \(i\) 列的贡献。

那么我们有 \(ans = \max\limits_{i \in [0,k]} \{L_i+R_{k-i}-i\times (k-i)\times p\}\)

用优先队列珂以达到 \(O(K\log (N+M))\)

CODE

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 5;
const int maxm = 1e6 + 5;
typedef long long ll;
int n,m,k,a[maxn][maxn];
ll p,L[maxm],R[maxm];
priority_queue<ll> q;
int main() {
	scanf("%d%d%d%lld",&n,&m,&k,&p);
	for(int i = 1;i <= n;++ i) {
		ll sum = 0;
		for(int j = 1;j <= m;++ j) {
			scanf("%d",&a[i][j]);
			sum += a[i][j];
		}
		q.push(sum);
	}
	for(int i = 1;i <= k;++ i) {
		ll u = q.top();
		q.pop();
		L[i] = L[i - 1] + u;
		u -= 1ll * m * p;
		q.push(u);
	}
	while(!q.empty())q.pop();
	for(int j = 1;j <= m;++ j) {
		ll sum = 0;
		for(int i = 1;i <= n;++ i) {
			sum += a[i][j];
		}
		q.push(sum);
	}
	for(int i = 1;i <= k;++ i) {
		ll u = q.top();
		q.pop();
		R[i] = R[i - 1] + u;
		u -= 1ll * n * p;
		q.push(u);
	}
	ll ans = -1e16;
	for(int i = 0;i <= k;++ i) {
		ans = max(ans , L[i] + R[k - i] - 1ll * i * (k - i) * p);
	}
	printf("%lld",ans);
	return 0;
}

完结撒花 *★,°:.☆( ̄▽ ̄)/$:*.°★

标签:const,int,题解,d%,times,Modification,maxn,maxm,DZY
来源: https://www.cnblogs.com/663B/p/16388116.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有