双单调队列90pts求助
查看原帖
双单调队列90pts求助
1069109
YF_yyds楼主2023/8/23 21:42
#include <bits/stdc++.h>
using namespace std;

const int N = 5010;
int t[N][N], tmax[N][N], tmax2[N][N], tmin[N][N], tmin2[N][N];
int q[N];
int a, b, n;

inline void read(int &x);

int main()
{
	read(a), read(b), read(n);
	for(int i = 1; i <= a; i++)
		for(int j = 1; j <= b; j++)
			read(t[i][j]);

	for(int i = 1; i <= a; i++)
	{
		int hh = 0, tt = -1;
		for(int j = 1; j <= b; j++)
		{
			while(hh <= tt && q[hh] < j - n + 1)	hh++;
			while(hh <= tt && t[i][q[hh]] <= t[i][j])	tt--;
			q[++tt] = j;
			tmax[i][j] = t[i][q[hh]];
		}
	}
	for(int i = n; i <= b; i++)
	{
		int hh = 0, tt = -1;
		for(int j = 1; j <= a; j++)
		{
			while(hh <= tt && q[hh] < j - n + 1)	hh++;
			while(hh <= tt && tmax[q[tt]][i] <= tmax[j][i])	tt--;
			q[++tt] = j;
			tmax2[j][i] = tmax[q[hh]][i];
		}
	}
	
	for(int i = 1; i <= a; i++)
	{
		int hh = 0, tt = -1;
		for(int j = 1; j <= b; j++)
		{
			while(hh <= tt && q[hh] < j - n + 1)	hh++;
			while(hh <= tt && t[i][q[tt]] >= t[i][j])	tt--;
			q[++tt] = j;
			tmin[i][j] = t[i][q[hh]];
		}
	}
	for(int i = n; i <= b; i++)
	{
		int hh = 0, tt = -1;
		for(int j = 1; j <= a; j++)
		{
			while(hh <= tt && q[hh] < j - n + 1)	hh++;
			while(hh <= tt && tmin[q[tt]][i] >= tmin[j][i])	tt--;
			q[++tt] = j;
			tmin2[j][i] = tmin[q[hh]][i];
		}
	}
	
//	for(int i = 1; i <= a; i++)
//	{
//		for(int j = 1; j <= b; j++)	printf("%10d", tmax2[i][j]);
//		puts("");
//	}
//	puts("---------------");
//	for(int i = 1; i <= a; i++)
//	{
//		for(int j = 1; j <= b; j++)	printf("%10d", tmin2[i][j]);
//		puts("");
//	}
	
	int res = INT_MAX;
	for(int i = n; i <= a; i++)
		for(int j = n; j <= b; j++)
			res = min(res, tmax2[i][j] - tmin2[i][j]);
//			printf("%2d%2d : %3d%3d\n", i, j, tmax2[i][j], tmin2[i][j]);
	printf("%d\n", res);
	return 0;
}

void read(int &x)
{
	x = 0;
	int f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9')
	{
		if(ch == '-')
			f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')
	{
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	x *= f;
}
2023/8/23 21:42
加载中...