首页 > 其他分享 >Codeforces Round 872 (Div. 2) B. LuoTianyi and the Table

Codeforces Round 872 (Div. 2) B. LuoTianyi and the Table

时间:2023-10-20 09:05:39浏览次数:31  
标签:前缀 最大值 LuoTianyi 872 Codeforces mx1 leq 最小值 sim

给一个 \(n \times m\) 的矩阵和 \(n \times m\) 个数,你需要把这些数填入矩阵。保证

\[\sum_{i=1}^n \sum_{j=1}^m \left ( \mathop{max}\limits_{1 \leq x \leq i, 1 \leq y \leq j} a_{x, y} - \mathop{min}\limits_{1 \leq x \leq i, 1 \leq y \leq j} a_{x, y} \right ) \]

在所有填数方案中最大。

输出这个最大值。

显然所求是所有二维前缀的最大值减去最小值之和。

不难想到:

  • 若最大值放在 \(a_{1, 1}\) ,则前缀最大值为定值。此时只需要让前缀最小值尽可能小。
    • 于是最小值和次小值在 \(a_{1, 2}\) 和 \(a_{2, 1}\) 的位置,就能取遍除 \(s_{1, 1}\) 外的前缀最小值。
  • 若最小值放在 \(a_{1, 1}\) ,则前缀最小值为定值。
    • 于是最大值和次大值在 \(a_{1, 2}\) 和 \(a_{2, 1}\) 的位置,就能取遍除 \(s_{1, 1}\) 外的前缀最大值。
  • 没有其他情况可能产生更大贡献。

不妨让 \(n \geq m\) 。设 \(mx_1, mx_2\) 为最大值和次大值,\(mi_1, mi_2\) 为最小值和次小值。

\(s_{1, 1}\) 不会产生贡献。

假设 \(a_{1, 1}\) 为最大值。则最小值要占据尽可能多的贡献,次小值占据剩下的贡献,以保证最小前缀的和最小。
则 \(min\_s_{1, 2 \sim n - 1}\) 为最小值,\(min\_s_{2 \sim m - 1, 1}\) 为次小值,\(min\_s_{2 \sim n, 2 \sim m}\) 为最小值。
\(ans_1 = (n \times m - 1) mx_1 - m (n - 1) mi_1 - (m - 1) mi_2\) 。

假设 \(a_{1, 1}\) 为最小值。则最大值要占据尽可能多的贡献,次大值占据剩下的贡献,以保证最大前缀的和最大。
则 \(max\_s_{1, 2 \sim n - 1}\) 为最大值,\(min\_s_{2 \sim m - 1, 1}\) 为次大值,\(min\_s_{2 \sim n, 2 \sim m}\) 为最大值。
\(ans_2 = m (n - 1) mx_1 + (m - 1) mx_2 - (n \times m - 1) mi_1\) 。

view
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve(){
	int n, m; std::cin >> n >> m;
	int mx1 = -1 << 30, mx2 = -1 << 30, mi1 = 1 << 30, mi2 = 1 << 30;
	for (int i = 0; i < n * m; i++) {
		int x; std::cin >> x;
		if (x > mx1) mx2 = mx1, mx1 = x;
		else if (x > mx2) mx2 = x;
		if (x < mi1) mi2 = mi1, mi1 = x;
		else if (x < mi2) mi2 = x;
	}
	if (n < m) std::swap(n, m);
	ll ans1 = 1LL * (n * m - 1) * mx1 - 1LL * m * (n - 1) * mi1 - 1LL * (m - 1) * mi2;
	ll ans2 = 1LL * m * (n - 1) * mx1 + 1LL * (m - 1) * mx2 - 1LL * (n * m - 1) * mi1;
	std::cout << std::max(ans1, ans2) << '\n';
}               
int main() { 
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
}

标签:前缀,最大值,LuoTianyi,872,Codeforces,mx1,leq,最小值,sim
From: https://www.cnblogs.com/zsxuan/p/17776166.html

相关文章

  • Educational Codeforces Round 149 (Rated for Div. 2) C. Best Binary String
    给一个字符串\(s\)包含\(0,1,?\)。定义一个\(01\)串\(s\)的\(cost\)为:选择\(s\)的任意一个子段\([l,r]\)并\(reverse\)。将\(s\)变为一个非降序序列时的\(reverse\)最小次数即\(cost\)。你可以让\(s\)的\(?\)换成\(0/1\),使新\(s\)的\(cost\)......
  • Educational Codeforces Round 150 (Rated for Div. 2) B. Keep it Beautiful
    数组\(a=[a_1,a_2,\cdots,a_n]\)被称为是美丽的,如果可以将\([1,x]\)段移到\([x+1,n]\)段后面,\(x\geq0\),数组可以构成非降序。现在有一个数组\(a\)(一开始为空)和\(q\)个询问,第\(i\)个询问给一个正整数\(x_i\)。需要逐步执行以下操作。若\(x_i\)拼接......
  • Codeforces Round 884 (Div. 1 + Div. 2) B. Permutations & Primes
    给一个正整数\(n\),你需要构造一个\(n\)的排列\(p_1,p_2,\cdots,p_n\)。对于排列\(p\)的每个子段\([l,r]\),\(mex_{i=l}^{r}a_i\)的结果为质数的次数尽可能多。此处的\(mex\)最小排除值最低为\(1\)而非\(0\)。不难想到,小质数\(2,3\)容易构造。于是有......
  • Codeforces Round 882 (Div. 2) B. Hamon Odyssey
    给一个长为\(n\)的数组\(a_1,a_2,\cdots,a_n\)。定义\(f(l,r)=\&_{i=l}^{r}a_i\)。你需要对\(a\)进行分段,使得各段的\(f(l,r)\)之和最小。在各段\(f(l,r)\)之和最小的情况下,尽可能分出更多的段。输出满足上述条件下,\(a\)可分的段数。......
  • Codeforces Round 888 (Div. 3) C. Tiles Comeback
    有\(n\)块瓷砖和一个正整数\(k\),第\(i\)块瓷砖染色为\(c_i\)。一开始站在第\(1\)块瓷砖往,然后可以开始往右跳吗,到第\(n\)块瓷砖停止。你可以得到的路径长度\(p\)为你从\(1\)到\(n\)踩过瓷砖的数量。你需要确定是否存在一条长度为\(p\)的路径满足。\(k\mid......
  • Codeforces Round 893 (Div. 2) C. Yet Another Permutation Problem
    有一个\(gcd\)游戏,按以下步骤进行:选择一个\(n\)的排列\(p_1,p_2,\cdots,p_n\)。对于每个\(i\),\(d_i=gcd(p_i,p_{i\%n+1})\)排列\(p\)的\(score\)为数组\([d_1,d_2,\cdots,d_n]\)中不同数的个数。给一个\(n\),需要构造一个排列\(p\),使得\(sco......
  • Codeforces Round 892 (Div. 2) B. Olya and Game with Arrays
    一系列\(n\)个数组,第\(i\)个数组的大小\(m_i\geq2\)。第\(i\)个数组为\(a_{m_1},a_{m_2},\cdots,a_{m_i}\)。对于每个数组,你可以移动最多一个元素到另一个数组。一系列\(n\)个数组的\(beauty\)定义为\(\sum_{i=1}^{n}min_{j=1}^{m_i}a_{i,j}\)。询问你......
  • Codeforces Round #870 (Div. 2) A. Trust Nobody
    题解#include<cstdio>#include<vector>#include<queue>#include<cstring>#include<algorithm>#include<iostream>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include......
  • Educational Codeforces Round 154 (Rated for Div. 2) B. Two Binary Strings
    给定两个长度相等的\(01\)字符串\(a\)和\(b\)。每个字符串都是以\(0\)开始以\(1\)结束。在一步操作中,你可以选择任意一个字符串:选择任意两个位置\(l,r\)满足\(s_l=s_r\),然后让\(\foralli\in[l,r],s_i=s_l\)。询问经过若干次操作后能否使得\(a=b......
  • 【codeforces】cf880div2 vp小结
    碎碎念多测要清空!清空从0开始循环!!!!!!!爆哭不知道因为初始化和清空罚了多少次了呜呜呜呜呜这次真的真的记得清空了,但是因为一直习惯下标从1开始所以导致for循环清空的时候a[0]没有清空A和B简简单单的两个签,但是C的难度就突然升高,补题的时候发现1700的时候真的...犹豫了一下要不要补......