Submission #847527

#TimeUsernameProblemLanguageResultExecution timeMemory
847527rainboySoccer Stadium (IOI23_soccer)C++17
100 / 100
341 ms94736 KiB
/* upsolved using ideas from PurpleCrayon */
#include "soccer.h"
#include <vector>

using namespace std;

typedef vector<int> vi;
typedef vector<vector<int>> vvi;

const int N = 2000;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int ll[N][N], uu[N][N], dd[N][N], dp[N][N], ii[N];

int biggest_stadium(int n, vvi aa) {
	for (int i = 0; i < n; i++)
		for (int j = 0, l = 0; j < n; j++)
			if (aa[i][j])
				l = j + 1;
			else
				ll[i][j] = l;
	for (int j = 0; j < n; j++)
		ii[j] = 0;
	for (int i = 0; i < n; i++)
		for (int j = 0, u = 0; j < n; j++)
			if (aa[i][j])
				ii[j] = i + 1, u = 0;
			else
				uu[i][j] = u = max(u, ii[j]);
	for (int j = 0; j < n; j++)
		ii[j] = n - 1;
	for (int i = n - 1; i >= 0; i--)
		for (int j = 0, d = n - 1; j < n; j++)
			if (aa[i][j])
				ii[j] = i - 1, d = n - 1;
			else
				dd[i][j] = d = min(d, ii[j]);
	int ans = 0;
	for (int l = n - 1; l >= 0; l--)
		for (int i = 0; i < n; i++)
			if (!aa[i][l] && ll[i][l] == l)
				for (int j = l; j < n && !aa[i][j]; j++) {
					int u = uu[i][j], d = dd[i][j];
					if (j == l)
						dp[i][j] = d - u + 1;
					else {
						dp[i][j] = dp[i][j - 1] + d - u + 1;
						if (u > 0 && !aa[u - 1][j])
							dp[i][j] = max(dp[i][j], dp[u - 1][j] + (d - u + 1) * (ll[u - 1][j] - ll[i][j]));
						if (d + 1 < n && !aa[d + 1][j])
							dp[i][j] = max(dp[i][j], dp[d + 1][j] + (d - u + 1) * (ll[d + 1][j] - ll[i][j]));
					}
					ans = max(ans, dp[i][j]);
				}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...