【题解】子数组

题目

题目描述

给出一个N行N列的二维数组,元素只取0,1,2这三种值,并且每行、每列的元素值单调不下降。在此数组中,找出一个值全部等于0或者全部等于2的子二维数组,使得这个子数组的元素个数最多。子二维数组是指行数、列数不超过N的连续的一个矩形区域。

输入格式

第1行:1个整数N,表示二维数组的行数和列数。行的编号从1到N,列的编号从1到N。

接下来N行,每行两个整数P1和P2。P1表示在该行中第1个1所在的列编号。如果该行没有1,则P1=0. P2表示该行中第1个2所在的列编号。如果该行没有2,则P2=0

输出格式

第1行:1个整数,表示最大的值全部等于0或者全部等于2的子二维数组的元素个数

第2行:1个整数,表示元素个数为最大值的子数组一共有多少个

注意,如果没有满足题意的子数组,在第1行和第2行上均输出0

样例

样例输入

8
4 0
4 8
4 8
3 7
3 6
3 5
2 3
0 2

样例输出

12
4

数据范围与提示

样例说明

输入数据描述的二维数组是这样的:

0 0 0 1 1 1 1 1
0 0 0 1 1 1 1 2
0 0 0 1 1 1 1 2
0 0 1 1 1 1 2 2
0 0 1 1 1 2 2 2
0 0 1 1 2 2 2 2
0 1 2 2 2 2 2 2
0 2 2 2 2 2 2 2

可以看出,一共有4个值全部相同的子二维数组,分别是:(1,1)到(6,2);(5,6)到(8,8); (7,3) 到 (8,8); (6,5)到(8,8).
【数据范围】 1<=N<=5000


题目描述里面有十分重要的一句话

每行、每列的元素值单调不下降

这可能还有一点抽象,那么看看根据样例画出来的图:

红:0黄:1蓝:2

avatar

发现了吧,黄色块(1)的左边是一个从左下角的位置向右上方的斜坡,右边也一样,这意味着什么呢?

我们不妨只以红色(0)做栗子为什么不用蓝色做栗子,因为蓝色的栗子不好吃

是的,只要在下方形成一个底,那么这个矩形一定能沿着这个底向上延伸至最上方(因为没有黄色块挡着它)

来看看图:

假设我们选的是红块最下面的那块([8,1])

avatar

那么它可以延伸至顶部([1,1]),形成一个面积为8的矩形([8,1]到[1,1])

avatar

假设我们选的是([6,1]到[6,2])

avatar

那么它可以延伸至顶部([1,1]到[1,2]),形成一个面积为12的矩形([1,1]到[6,2])

avatar

栗子不用再举了吧,所以我们已经猜到解法了吧,是的,从下到上枚举,对于每一行,首先保证宽尽量大(0全选),接着用这个宽乘以当前这个宽到顶部的距离,取max

2同理2终于出现了,又走了

最后记得在用同样的方法遍历一次,得到元素个数为最大值的子数组一共有多少个

注意输入0的一些稀奇古怪的特判我错了3次嘤嘤嘤

代码(不要抄)

#include<cstdio>
#include<iostream>
using namespace std;
struct tfw{
	int x0,x2;
}arr[5005];
int max(long long a,long long b){
	return a>b?a:b;
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d %d",&arr[i].x0,&arr[i].x2);
		if(arr[i].x2==0) arr[i].x2=n+1;
		if(arr[i].x0==0){
			arr[i].x0=arr[i].x2-1;
		}
		else arr[i].x0--;
		arr[i].x2=n-arr[i].x2+1;
	}
	long long max_=0;
	for(int i=n;i>=1;i--){
		max_=max(max_,arr[i].x0*i);
	}
	for(int i=1;i<=n;i++){
		max_=max(max_,arr[i].x2*(n-i+1));
	}
	long long tot=0;
	for(int i=n;i>=1;i--){
		if(arr[i].x0*i==max_) tot++;
	}
	for(int i=1;i<=n;i++){
		if(arr[i].x2*(n-i+1)==max_) tot++;
	}
	if(max_==0){
		printf("0\n0");
	} 
	else{
		printf("%lld\n%lld",max_,tot);
	}
return 0;
}

猜你喜欢

转载自blog.csdn.net/tanfuwen_/article/details/106855090