Codeforces 2021 C Those Who Are With Us

Problem Discription\]\\color{blue}{\\texttt{\[Problem Discription\]}}\[Problem Discription

给定一个 n×mn \times mn×m 的表格 ai,ja_{i,j}ai,j,你可以恰好进行一次如下操作:

  1. 选择一个格点 (r,c)(r,c)(r,c)。
  2. 对于所有满足 i=ri=ri=r 或者 j=cj=cj=c 的格点 (i,j)(i,j)(i,j),使 ai,j←ai,j−1a_{i,j} \leftarrow a_{i,j}-1ai,j←ai,j−1。

求操作后所有格点最大值最小可能为多少。

多组数据,满足 1≤n×m≤1×1051 \leq n \times m \leq 1 \times 10^{5}1≤n×m≤1×105,且所有数据的 n×mn \times mn×m 的总和不超过 2×1052 \times 10^{5}2×105。

Analysis\]\\color{blue}{\\texttt{\[Analysis\]}}\[Analysis

记原来矩阵的最大值为 ttt,显然由于只能进行一次操作,且一次操作最多让一个格点的值减小 111,所以最终答案要么是 ttt,要么是 (t−1)(t-1)(t−1)。

思考哪些情况会让答案为 (t−1)(t-1)(t−1)。

显然,当所有取得最大值的格点要么分布在第 rrr 行要么分布在第 ccc 列时,我们可以通过一次操作 (r,c)(r,c)(r,c) 把所有最大值都干掉;否则答案为 ttt 不变。

统计每一行每一列有多少个最大值,分别记为 cntri,cntcj\text{cntr}{i},\text{cntc}{j}cntri,cntcj,显然第 iii 行和第 jjj 列的最大值的个数即为:

f(i,j)=cntri+cntcj−ai,j=max⁡1≤i≤n,1≤j≤m{ai,j}f(i,j)=\text{cntr}{i}+\text{cntc}{j}- \left a_{i,j}=\\max\\limits_{1 \\leq i \\leq n, 1 \\leq j \\leq m} \\{a_{i,j} \\}\\right f(i,j)=cntri+cntcj−ai,j=1≤i≤n,1≤j≤mmax{ai,j}

显然预先统计出最大值的个数 cnt\text{cnt}cnt,如果某个格点 (i,j)(i,j)(i,j) 满足 f(i,j)=cntf(i,j)=\text{cnt}f(i,j)=cnt,那么这个 (i,j)(i,j)(i,j) 就是我们需要的格点。

Code\color{blue}{\text{Code}}Code

cpp 复制代码
const int N=1e5+100;

int OneZDoubleY(){
	int n=read(),m=read();
	vector<int> a[n+2];
	for(int i=1;i<=n;i++){
		a[i].push_back(0);
		for(int j=1;j<=m;j++)
			a[i].push_back(read());
	}
	
	int maxn=a[1][1];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			ckmax(maxn,a[i][j]);
	
	int cnt=0;
	vector<int> cntr(n+1),cntc(m+1);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if (a[i][j]==maxn){
				++cntr[i];
				++cntc[j];
				++cnt;
			}
	
	bool flag=false;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			int t=cntr[i]+cntc[j];
			if (a[i][j]==maxn) t--;
			
			if (t==cnt){
				flag=true;
				break;
			}
		}
	
	return printf("%d\n",flag?maxn-1:maxn);
}
//大家可以挑战一下不用 vector,用 malloc 来处理

int main(){
	int T=read();
	while (T--) OneZDoubleY();
	
	return 0;
}
相关推荐
奋发向前wcx31 分钟前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
王维同学3 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
战族狼魂4 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
李剑一4 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH4 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
中达瑞和-高光谱·多光谱4 小时前
1nm到8nm光谱分辨率,你的应用该选哪款光谱相机?
算法·高光谱·高光谱相机
脱胎换骨-军哥4 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
ChaoZiLL5 小时前
我的数据结构4-栈和队列
数据结构
香辣牛肉饭5 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
miller-tsunami5 小时前
顺序表相关知识点
数据结构·顺序表