Submission #1235506

#TimeUsernameProblemLanguageResultExecution timeMemory
1235506k1r1t0Soccer Stadium (IOI23_soccer)C++20
48 / 100
161 ms147472 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 510;

short t[N][N][N];
bool a[N][N];
vector<array<short, 4>> rect;
vector<int> dp;
int s[N][N], m;

int biggest_stadium(int n, vector<vector<int>> f) {
	for (int i = 1; i <= n; i++)
	for (int j = 1; j <= n; j++)
		a[i][j] = f[i - 1][j - 1];
	for (int i = 1; i <= n; i++)
	for (int j = 1; j <= n; j++)
		s[i][j] = s[i][j - 1] + a[i][j];
	for (int l = 1; l <= n; l++)
	for (int r = l; r <= n; r++)
	for (int i = 1; i <= n; i++)
		t[l][r][i] = -1;
	for (int l = 1; l <= n; l++)
	for (int r = n; r >= l; r--) {
		int ptr = 1;
		while (ptr <= n) {
			if (s[ptr][r] - s[ptr][l - 1] > 0) {
				ptr++;
				continue;
			}
			int last = ptr;
			while (last <= n && s[last][r] - s[last][l - 1] == 0)
				last++;
			for (int i = ptr; i < last; i++)
				t[l][r][i] = rect.size();
			rect.push_back({l, r, ptr, last - 1});
			ptr = last;
		}
	}
	m = rect.size();
	dp = vector<int>(m);
	for (int i = 0; i < m; i++)
		dp[i] = (rect[i][1] - rect[i][0] + 1) * (rect[i][3] - rect[i][2] + 1);
	for (int i = 0; i < m; i++) {
		auto [lx, rx, ly, ry] = rect[i];
		if (lx + 1 <= rx) {
			int j = t[lx + 1][rx][ly];
			auto [nlx, nrx, nly, nry] = rect[j];
			dp[j] = max(dp[j], dp[i] + (nrx - nlx + 1) * (nry - ry + ly - nly));
		}
		if (lx <= rx - 1) {
			int j = t[lx][rx - 1][ly];
			auto [nlx, nrx, nly, nry] = rect[j];
			dp[j] = max(dp[j], dp[i] + (nrx - nlx + 1) * (nry - ry + ly - nly));
		}
	}
	int ans = 0;
	for (int i = 0; i < m; i++)
		ans = max(ans, dp[i]);
	return ans;
}














/*
int main()
{
    int N;
    assert(1 == scanf("%d", &N));
    std::vector<std::vector<int>> F(N, std::vector<int>(N));
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            assert(1 == scanf("%d", &F[i][j]));
        }
    }
    fclose(stdin);

    int res = biggest_stadium(N, F);

    printf("%d\n", res);
    fclose(stdout);
    return 0;
}
//*/

Compilation message (stderr)

soccer.cpp: In function 'int biggest_stadium(int, std::vector<std::vector<int> >)':
soccer.cpp:38:41: warning: narrowing conversion of 'l' from 'int' to 'short int' [-Wnarrowing]
   38 |                         rect.push_back({l, r, ptr, last - 1});
      |                                         ^
soccer.cpp:38:44: warning: narrowing conversion of 'r' from 'int' to 'short int' [-Wnarrowing]
   38 |                         rect.push_back({l, r, ptr, last - 1});
      |                                            ^
soccer.cpp:38:47: warning: narrowing conversion of 'ptr' from 'int' to 'short int' [-Wnarrowing]
   38 |                         rect.push_back({l, r, ptr, last - 1});
      |                                               ^~~
soccer.cpp:38:57: warning: narrowing conversion of '(last - 1)' from 'int' to 'short int' [-Wnarrowing]
   38 |                         rect.push_back({l, r, ptr, last - 1});
      |                                                    ~~~~~^~~
#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...