救救萌新!
  • 板块P2363 马农
  • 楼主lxy__
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/8/7 20:19
  • 上次更新2023/11/6 20:59:51
查看原帖
救救萌新!
138280
lxy__楼主2020/8/7 20:19

题解里 d 数组是存矩阵和的

根据题目里面“注意:收益可能是负数,养马也不是包赚的,马匹也可能出现生病死亡等意外。”这一句,矩阵和出现负数可能导致越界。

为此我开了 map,TLE 了好几次,改成普通数组就过了。求助各位巨佬是什么原因。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;

const int N = 53;
int n, ans = 0, a[N][N], sum[N][N][N][N], sum2[N][N][N][N], f[11111111];
//原先的 f 数组是 map

int main()
{
	scanf("%d", &n);
	
	memset(sum, 0, sizeof(sum));
	memset(sum2, 0, sizeof(sum2));
	
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++)
			scanf("%d", &a[i][j]);
	
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++)
		{
			sum[i][j][i][j] = a[i][j];
			for(int k = i; k <= n; k++)
				for(int h = j; h <= n; h++)
					sum[i][j][k][h] = a[k][h] + sum[i][j][k - 1][h] + 
					sum[i][j][k][h - 1] - sum[i][j][k - 1][h - 1];
		}
	
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++)
		{
			sum2[i][j][i][j] = a[i][j];
			for(int k = i; k > 0; k--)
				for(int h = j; h <= n; h++)
					sum2[i][j][k][h] = a[k][h] + sum2[i][j][k + 1][h] + 
					sum2[i][j][k][h - 1] - sum2[i][j][k + 1][h - 1];
		}
	
	for(int i = 2; i <= n; i++)
		for(int j = 2; j <= n; j++)
		{
			for(int k = i - 1; k > 0; k--)
				for(int h = j - 1; h > 0; h--)
					f[sum[k][h][i - 1][j - 1]]++;
			for(int k = i + 1; k <= n + 1; k++)
				for(int h = j + 1; h <= n + 1; h++)
					ans += f[sum[i][j][k - 1][h - 1]];
					
			for(int k = i - 1; k > 0; k--)
				for(int h = j - 1; h > 0; h--)
					f[sum[k][h][i - 1][j - 1]] = 0;
		
			for(int k = i + 1; k <= n + 1; k++)
				for(int h = j - 1; h > 0; h--)
					f[sum2[k - 1][h][i][j - 1]]++;
			for(int k = i - 1; k > 0; k--)
				for(int h = j + 1; h <= n + 1; h++)
					ans += f[sum2[i - 1][j][k][h - 1]];
				
			for(int k = i + 1; k <= n + 1; k++)
				for(int h = j - 1; h > 0; h--)
					f[sum2[k - 1][h][i][j - 1]] = 0;
		}
	printf("%d", ans);
	return 0;
}
2020/8/7 20:19
加载中...