Subtask1 WA求调!
查看原帖
Subtask1 WA求调!
1062172
lgj3475楼主2024/5/14 21:18
```cpp
//理想的正方形
//快速处理出每个子矩阵的最大值和最小值
//O(1)复杂度取最大最小,O(n^2)复杂度枚举
#include<iostream>

using namespace std;

const int N = 1e3 + 10;
int a, b, n;
int g[N][N];//矩阵
int r_max[N][N], r_min[N][N];//第一维处理行最值
int c_max[N][N], c_min[N][N];//第二遍在前面的基础上把每一列的行最值再处理出最值,从而直接得出子矩阵最值
int res = 0x3fffffff;

void get_max(int b[], int a[], int n,int m)
{
	int q[N], hh = 0, tt = 0;

	for (int i = 1; i <= n; i++)
	{
		//判断队头是否弹出
		if (hh <= tt && i - q[hh] >= m) hh++;

		//维护单调递减队列
		while (hh <= tt && a[q[tt]] <= a[i]) tt--;

		q[++tt] = i;

		if (i >= m) b[i - m + 1] = a[q[hh]];
	}
}

void get_min(int b[], int a[], int n, int m)
{
	int q[N], hh = 0, tt = 0;

	for (int i = 1; i <= n; i++)
	{
		//判断队头是否弹出
		if (hh <= tt && i - q[hh] >= m) hh++;

		//维护单调递增队列
		while (hh <= tt && a[q[tt]] >= a[i]) tt--;

		q[++tt] = i;

		if (i >= m) b[i - m + 1] = a[q[hh]];
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> a >> b >> n;

	for (int i = 1; i <= a; i++)
		for (int j = 1; j <= b; j++) cin >> g[i][j];

	//处理行最值
	for (int i = 1; i <= a; i++)
	{
		get_max(r_max[i], g[i], b, n);
		get_min(r_min[i], g[i], b, n);
	}

	//处理列最值
	int A[N], B[N];//用来拷贝数据
	for (int j = 1; j <= b; j++)
	{
		//先拷贝每一列的数据
		for (int i = 1; i <= a; i++) A[i] = r_max[i][j];
		for (int i = 1; i <= a; i++) B[i] = r_min[i][j];


		//列的数据被c以行的形式存了进来,后面要转置一波
		get_max(c_max[j], A, a, n);
		get_min(c_min[j], B, a, n);
	}

	for (int i = 1; i <= a; i++)
	{
		for (int j = 1; j <= b; j++)
			cout << c_max[j][i] << ' ';
		cout << endl;
	}
		

	//开始枚举
	for (int i = 1; i+n-1 <= a; i++)
		for (int j = 1; j+n-1 <= b; j++)
			res = min(res, c_max[j][i] - c_min[j][i]);

	cout << res << endl;

	return 0;
}

哪里出了问题呢,怎么WA了一个点

2024/5/14 21:18
加载中...