답안 #1011957

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1011957 2024-07-01T12:00:08 Z mdn2002 축구 경기장 (IOI23_soccer) C++17
70 / 100
4500 ms 456176 KB
#include "soccer.h"
#include<bits/stdc++.h>
using namespace std;
int dp[8000006];
int biggest_stadium(int N, vector<vector<int>> F) {
    memset(dp, -1, sizeof dp);
    int n = N;
    vector<vector<int>> a = F, next(n, vector<int>(n)), sum(n, vector<int>(n));
    map<vector<int>, int> mp;
    vector<vector<int>> v(n);

    function<int(int, int, int, int)> summ = [&] (int l, int r, int x, int y) {
        long long ans = sum[y][r];
        if (x - 1 >= 0) ans -= sum[x - 1][r];
        if (l - 1 >= 0) ans -= sum[y][l - 1];
        if (x - 1 >= 0 && l - 1 >= 0) ans += sum[x - 1][l - 1];
        return ans;
    };

    int cnt = 0;
    function<int(int, int, int, int)> f = [&] (int l, int r, int x, int y) {
        if (mp.count({l, r, x, y}) == 0) mp[{l, r, x, y}] = ++ cnt;
        int ans = 0, id = mp[{l, r, x, y}];
        if (dp[id] != -1) return dp[id];
        if (x - 1 >= 0) {
            for (int j = l; j <= r; j ++) {
                int z = min(r, next[x - 1][j]);
                if (a[x - 1][j] == 0) {
                    int ll = 0, rr = x, mid;
                    while (ll < rr) {
                        mid = (ll + rr) / 2;
                        if (summ(j, z, mid, y) == 0) rr = mid;
                        else ll = mid + 1;
                    }
                    ans = max(ans, f(j, z, ll, y) + (z - j + 1) * (x - ll));
                }
                j = *upper_bound(v[x - 1].begin(), v[x - 1].end(), z) - 1;
            }
        }
        if (y + 1 < n) {
            for (int j = l; j <= r; j ++) {
                int z = min(r, next[y + 1][j]);
                if (a[y + 1][j] == 0) {
                    int ll = y + 1, rr = n, mid;
                    while (ll < rr) {
                        mid = (ll + rr) / 2;
                        if (summ(j, z, x, mid) == 0) ll = mid + 1;
                        else rr = mid;
                    }
                    ll --;
                    ans = max(ans, f(j, z, x, ll) + (z - j + 1) * (ll - y));
                }
                j = *upper_bound(v[y + 1].begin(), v[y + 1].end(), z) - 1;;
            }
        }

        return dp[id] = ans;
    };

    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < n; j ++) {
            sum[i][j] += a[i][j];
            if (j) sum[i][j] += sum[i][j - 1];
            if (a[i][j] == 0) v[i].push_back(j);
        }
        v[i].push_back(n + 1);
    }
    for (int i = 1; i < n; i ++) {
        for (int j = 0; j < n; j ++) sum[i][j] += sum[i - 1][j];
    }
    for (int i = 0; i < n; i ++) {
        if (a[i][n - 1] == 0) next[i][n - 1] = n - 1;
        else next[i][n - 1] = n - 2;
        for (int j = n - 2; j >= 0; j --) {
            if (a[i][j]) next[i][j] = j - 1;
            else next[i][j] = next[i][j + 1];
        }
    }
    int ans = 0;
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < n; j ++) {
            if (a[i][j]) continue;
            int ll = i, rr = n, mid, x, y;
            while (ll < rr) {
                mid = (ll + rr) / 2;
                if (summ(j, next[i][j], i, mid) == 0) ll = mid + 1;
                else rr = mid;
            }
            ll --;
            y = ll;

            ll = 0, rr = i;
            while (ll < rr) {
                mid = (ll + rr) / 2;
                if (summ(j, next[i][j], mid, i) == 0) rr = mid;
                else ll = mid + 1;
            }
            x = ll;
            ans = max(ans, f(j, next[i][j], x, y) + (next[i][j] - j + 1) * (y - x + 1));
            j = next[i][j];
        }
    }
    return ans;
}
/*
3
0 0 0
0 1 0
0 0 0
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 31580 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 31576 KB ok
2 Correct 13 ms 31748 KB ok
3 Correct 13 ms 31580 KB ok
4 Correct 11 ms 31704 KB ok
5 Correct 12 ms 31576 KB ok
6 Correct 12 ms 31832 KB ok
7 Correct 13 ms 31836 KB ok
8 Correct 26 ms 38224 KB ok
9 Correct 240 ms 134228 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 31576 KB ok
2 Correct 13 ms 31748 KB ok
3 Correct 12 ms 31680 KB ok
4 Correct 14 ms 31580 KB ok
5 Correct 13 ms 31596 KB ok
6 Correct 12 ms 31580 KB ok
7 Correct 15 ms 31580 KB ok
8 Correct 12 ms 31640 KB ok
9 Correct 11 ms 31580 KB ok
10 Correct 13 ms 31580 KB ok
11 Correct 13 ms 31580 KB ok
12 Correct 13 ms 31596 KB ok
13 Correct 12 ms 31580 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 31580 KB ok
2 Correct 12 ms 31576 KB ok
3 Correct 13 ms 31748 KB ok
4 Correct 12 ms 31680 KB ok
5 Correct 14 ms 31580 KB ok
6 Correct 13 ms 31596 KB ok
7 Correct 12 ms 31580 KB ok
8 Correct 15 ms 31580 KB ok
9 Correct 12 ms 31640 KB ok
10 Correct 11 ms 31580 KB ok
11 Correct 13 ms 31580 KB ok
12 Correct 13 ms 31580 KB ok
13 Correct 13 ms 31596 KB ok
14 Correct 12 ms 31580 KB ok
15 Correct 12 ms 31680 KB ok
16 Correct 14 ms 31628 KB ok
17 Correct 12 ms 31580 KB ok
18 Correct 13 ms 31576 KB ok
19 Correct 12 ms 31580 KB ok
20 Correct 12 ms 31580 KB ok
21 Correct 13 ms 31744 KB ok
22 Correct 12 ms 31580 KB ok
23 Correct 13 ms 31580 KB ok
24 Correct 12 ms 31580 KB ok
25 Correct 12 ms 31744 KB ok
26 Correct 12 ms 31580 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 31580 KB ok
2 Correct 12 ms 31576 KB ok
3 Correct 13 ms 31748 KB ok
4 Correct 13 ms 31580 KB ok
5 Correct 11 ms 31704 KB ok
6 Correct 12 ms 31680 KB ok
7 Correct 14 ms 31580 KB ok
8 Correct 13 ms 31596 KB ok
9 Correct 12 ms 31580 KB ok
10 Correct 15 ms 31580 KB ok
11 Correct 12 ms 31640 KB ok
12 Correct 11 ms 31580 KB ok
13 Correct 13 ms 31580 KB ok
14 Correct 13 ms 31580 KB ok
15 Correct 13 ms 31596 KB ok
16 Correct 12 ms 31580 KB ok
17 Correct 12 ms 31680 KB ok
18 Correct 14 ms 31628 KB ok
19 Correct 12 ms 31580 KB ok
20 Correct 13 ms 31576 KB ok
21 Correct 12 ms 31580 KB ok
22 Correct 12 ms 31580 KB ok
23 Correct 13 ms 31744 KB ok
24 Correct 12 ms 31580 KB ok
25 Correct 13 ms 31580 KB ok
26 Correct 12 ms 31580 KB ok
27 Correct 12 ms 31744 KB ok
28 Correct 12 ms 31580 KB ok
29 Correct 12 ms 31592 KB ok
30 Correct 11 ms 31576 KB ok
31 Correct 13 ms 31836 KB ok
32 Correct 15 ms 31576 KB ok
33 Correct 12 ms 31576 KB ok
34 Correct 12 ms 31580 KB ok
35 Correct 14 ms 31612 KB ok
36 Correct 13 ms 31580 KB ok
37 Correct 12 ms 31652 KB ok
38 Correct 13 ms 31744 KB ok
39 Correct 12 ms 31576 KB ok
40 Correct 11 ms 31724 KB ok
41 Correct 12 ms 31580 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 31580 KB ok
2 Correct 12 ms 31576 KB ok
3 Correct 13 ms 31748 KB ok
4 Correct 13 ms 31580 KB ok
5 Correct 11 ms 31704 KB ok
6 Correct 12 ms 31680 KB ok
7 Correct 14 ms 31580 KB ok
8 Correct 13 ms 31596 KB ok
9 Correct 12 ms 31580 KB ok
10 Correct 15 ms 31580 KB ok
11 Correct 12 ms 31640 KB ok
12 Correct 11 ms 31580 KB ok
13 Correct 13 ms 31580 KB ok
14 Correct 13 ms 31580 KB ok
15 Correct 13 ms 31596 KB ok
16 Correct 12 ms 31580 KB ok
17 Correct 12 ms 31680 KB ok
18 Correct 14 ms 31628 KB ok
19 Correct 12 ms 31580 KB ok
20 Correct 13 ms 31576 KB ok
21 Correct 12 ms 31580 KB ok
22 Correct 12 ms 31580 KB ok
23 Correct 13 ms 31744 KB ok
24 Correct 12 ms 31580 KB ok
25 Correct 13 ms 31580 KB ok
26 Correct 12 ms 31580 KB ok
27 Correct 12 ms 31744 KB ok
28 Correct 12 ms 31580 KB ok
29 Correct 12 ms 31592 KB ok
30 Correct 11 ms 31576 KB ok
31 Correct 13 ms 31836 KB ok
32 Correct 15 ms 31576 KB ok
33 Correct 12 ms 31576 KB ok
34 Correct 12 ms 31580 KB ok
35 Correct 14 ms 31612 KB ok
36 Correct 13 ms 31580 KB ok
37 Correct 12 ms 31652 KB ok
38 Correct 13 ms 31744 KB ok
39 Correct 12 ms 31576 KB ok
40 Correct 11 ms 31724 KB ok
41 Correct 12 ms 31580 KB ok
42 Correct 333 ms 63524 KB ok
43 Correct 233 ms 57168 KB ok
44 Correct 425 ms 69432 KB ok
45 Correct 351 ms 64592 KB ok
46 Correct 407 ms 68560 KB ok
47 Correct 28 ms 38236 KB ok
48 Correct 59 ms 41040 KB ok
49 Correct 56 ms 40788 KB ok
50 Correct 146 ms 51528 KB ok
51 Correct 46 ms 40484 KB ok
52 Correct 41 ms 39260 KB ok
53 Correct 27 ms 37456 KB ok
54 Correct 40 ms 38980 KB ok
55 Correct 49 ms 39920 KB ok
56 Correct 26 ms 37468 KB ok
57 Correct 72 ms 45072 KB ok
58 Correct 84 ms 45956 KB ok
59 Correct 95 ms 46928 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 31580 KB ok
2 Correct 12 ms 31576 KB ok
3 Correct 13 ms 31748 KB ok
4 Correct 13 ms 31580 KB ok
5 Correct 11 ms 31704 KB ok
6 Correct 12 ms 31576 KB ok
7 Correct 12 ms 31832 KB ok
8 Correct 13 ms 31836 KB ok
9 Correct 26 ms 38224 KB ok
10 Correct 240 ms 134228 KB ok
11 Correct 12 ms 31680 KB ok
12 Correct 14 ms 31580 KB ok
13 Correct 13 ms 31596 KB ok
14 Correct 12 ms 31580 KB ok
15 Correct 15 ms 31580 KB ok
16 Correct 12 ms 31640 KB ok
17 Correct 11 ms 31580 KB ok
18 Correct 13 ms 31580 KB ok
19 Correct 13 ms 31580 KB ok
20 Correct 13 ms 31596 KB ok
21 Correct 12 ms 31580 KB ok
22 Correct 12 ms 31680 KB ok
23 Correct 14 ms 31628 KB ok
24 Correct 12 ms 31580 KB ok
25 Correct 13 ms 31576 KB ok
26 Correct 12 ms 31580 KB ok
27 Correct 12 ms 31580 KB ok
28 Correct 13 ms 31744 KB ok
29 Correct 12 ms 31580 KB ok
30 Correct 13 ms 31580 KB ok
31 Correct 12 ms 31580 KB ok
32 Correct 12 ms 31744 KB ok
33 Correct 12 ms 31580 KB ok
34 Correct 12 ms 31592 KB ok
35 Correct 11 ms 31576 KB ok
36 Correct 13 ms 31836 KB ok
37 Correct 15 ms 31576 KB ok
38 Correct 12 ms 31576 KB ok
39 Correct 12 ms 31580 KB ok
40 Correct 14 ms 31612 KB ok
41 Correct 13 ms 31580 KB ok
42 Correct 12 ms 31652 KB ok
43 Correct 13 ms 31744 KB ok
44 Correct 12 ms 31576 KB ok
45 Correct 11 ms 31724 KB ok
46 Correct 12 ms 31580 KB ok
47 Correct 333 ms 63524 KB ok
48 Correct 233 ms 57168 KB ok
49 Correct 425 ms 69432 KB ok
50 Correct 351 ms 64592 KB ok
51 Correct 407 ms 68560 KB ok
52 Correct 28 ms 38236 KB ok
53 Correct 59 ms 41040 KB ok
54 Correct 56 ms 40788 KB ok
55 Correct 146 ms 51528 KB ok
56 Correct 46 ms 40484 KB ok
57 Correct 41 ms 39260 KB ok
58 Correct 27 ms 37456 KB ok
59 Correct 40 ms 38980 KB ok
60 Correct 49 ms 39920 KB ok
61 Correct 26 ms 37468 KB ok
62 Correct 72 ms 45072 KB ok
63 Correct 84 ms 45956 KB ok
64 Correct 95 ms 46928 KB ok
65 Execution timed out 4552 ms 456176 KB Time limit exceeded
66 Halted 0 ms 0 KB -