답안 #996961

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
996961 2024-06-11T14:10:26 Z MilosMilutinovic 축구 경기장 (IOI23_soccer) C++17
54 / 100
4500 ms 598096 KB
#include "soccer.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX = 2005;
const int LOG = 15;

int n, a[MAX][MAX];
int L[MAX][MAX];
int R[MAX][MAX];
int U[MAX][MAX];
int D[MAX][MAX];
int go[MAX][MAX];
int logs[MAX];
int st_U[MAX][MAX][LOG];
int st_D[MAX][MAX][LOG];
int res;
map<array<int, 4>, int> mx;

int query_U(int i, int l, int r) {
  int k = logs[r - l + 1];
  return max(st_U[i][l][k], st_U[i][r - (1 << k) + 1][k]);
}

int query_D(int i, int l, int r) {
  int k = logs[r - l + 1];
  return min(st_D[i][l][k], st_D[i][r - (1 << k) + 1][k]);
}

void rec(int xl, int xr, int yl, int yr, int side, int cur) {
  if (mx[{xl, xr, yl, yr}] >= cur) {
    return;
  }
  res = max(res, cur);
  mx[{xl, xr, yl, yr}] = cur;
  vector<array<int, 5>> f;
  if (xl > 0) {
    // up
    int ptr = yl;
    while (ptr <= yr) {
      if (a[xl - 1][ptr] == 1) {
        ptr = go[xl - 1][ptr];
        continue;
      }
      int t = min(yr, R[xl - 1][ptr]);
      int new_x = query_U(xl - 1, ptr, t);
      //f.push_back({(t - ptr + 1) * (xl - new_x), new_x, xr, ptr, t});
      rec(new_x, xr, ptr, t, 1, cur + (t - ptr + 1) * (xl - new_x));
      ptr = R[xl - 1][ptr] + 1;
    }
  }
  if (xr + 1 < n) {
    // down
    int ptr = yl;
    while (ptr <= yr) {
      if (a[xr + 1][ptr] == 1) {
        ptr = go[xr + 1][ptr];
        continue;
      }
      int t = min(yr, R[xr + 1][ptr]);
      int new_x = query_D(xr + 1, ptr, t);
      f.push_back({(t - ptr + 1) * (new_x - xr), xl, new_x, ptr, t});
      //rec(xl, xr + 1, ptr, t, 0, cur + t - ptr + 1);
      ptr = R[xr + 1][ptr] + 1;
    }
  }
  sort(f.rbegin(), f.rend());
  for (auto& p : f) {
    int sd = (p[1] == xl ? 0 : 1);
    rec(p[1], p[2], p[3], p[4], sd, cur + p[0]);
  }
}

int biggest_stadium(int N, vector<vector<int>> F) {
  n = N;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      a[i][j] = F[i][j];
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (a[i][j] == 1) {
        continue;
      }
      int p = j;
      while (p + 1 < n && a[i][p + 1] == 0) {
        p += 1;
      }
      for (int k = j; k <= p; k++) {
        L[i][k] = j;
        R[i][k] = p;
      }
      j = p;
    }
  }
  for (int j = 0; j < n; j++) {
    for (int i = 0; i < n; i++) {
      if (a[i][j] == 1) {
        continue;
      }
      int p = i;
      while (p + 1 < n && a[p + 1][j] == 0) {
        p += 1;
      }
      for (int k = i; k <= p; k++) {
        U[k][j] = i;
        D[k][j] = p;
      }
      i = p;
    }
  }
  for (int i = 2; i <= n; i++) {
    logs[i] = logs[i >> 1] + 1;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      st_U[i][j][0] = U[i][j];
      st_D[i][j][0] = D[i][j];
    }
  }
  for (int k = 1; k < LOG; k++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j + (1 << k) <= n; j++) {
        st_U[i][j][k] = max(st_U[i][j][k - 1], st_U[i][j + (1 << (k - 1))][k - 1]);
        st_D[i][j][k] = min(st_D[i][j][k - 1], st_D[i][j + (1 << (k - 1))][k - 1]);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = n - 1; j >= 0; j--) {
      if (a[i][j] == 1) {
        go[i][j] = (j == n - 1 ? n : go[i][j + 1]);
      } else {
        go[i][j] = j;
      }
    }
  }
  res = 0;
  vector<array<int, 4>> s;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (a[i][j] == 1) {
        continue;
      }
      if (j == 0 || a[i][j - 1] == 1) {
        s.push_back({R[i][j] - j + 1, i, j, R[i][j]});
      }
    }
  }
  sort(s.rbegin(), s.rend());
  for (auto& p : s) {
    int i = p[1];
    int l = p[2], r = p[3];
    rec(i, i, l, r, -1, r - l + 1);
  }
  return res;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16732 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16728 KB ok
2 Correct 2 ms 16732 KB ok
3 Correct 2 ms 16732 KB ok
4 Correct 2 ms 16728 KB ok
5 Correct 2 ms 14684 KB ok
6 Correct 2 ms 16732 KB ok
7 Correct 5 ms 43612 KB ok
8 Correct 34 ms 159060 KB ok
9 Correct 562 ms 598096 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16728 KB ok
2 Correct 2 ms 16732 KB ok
3 Correct 2 ms 16728 KB ok
4 Correct 2 ms 16732 KB ok
5 Correct 2 ms 16728 KB ok
6 Correct 2 ms 16732 KB ok
7 Correct 2 ms 16732 KB ok
8 Correct 2 ms 16732 KB ok
9 Correct 2 ms 16732 KB ok
10 Correct 2 ms 16732 KB ok
11 Correct 2 ms 16732 KB ok
12 Correct 2 ms 16728 KB ok
13 Correct 1 ms 16732 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16732 KB ok
2 Correct 2 ms 16728 KB ok
3 Correct 2 ms 16732 KB ok
4 Correct 2 ms 16728 KB ok
5 Correct 2 ms 16732 KB ok
6 Correct 2 ms 16728 KB ok
7 Correct 2 ms 16732 KB ok
8 Correct 2 ms 16732 KB ok
9 Correct 2 ms 16732 KB ok
10 Correct 2 ms 16732 KB ok
11 Correct 2 ms 16732 KB ok
12 Correct 2 ms 16732 KB ok
13 Correct 2 ms 16728 KB ok
14 Correct 1 ms 16732 KB ok
15 Correct 2 ms 16732 KB ok
16 Correct 1 ms 16732 KB ok
17 Correct 1 ms 16732 KB ok
18 Correct 2 ms 16732 KB ok
19 Correct 2 ms 16732 KB ok
20 Correct 1 ms 16732 KB ok
21 Correct 1 ms 16900 KB ok
22 Correct 2 ms 16732 KB ok
23 Correct 2 ms 16732 KB ok
24 Correct 1 ms 16732 KB ok
25 Correct 2 ms 16732 KB ok
26 Correct 2 ms 16728 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16732 KB ok
2 Correct 2 ms 16728 KB ok
3 Correct 2 ms 16732 KB ok
4 Correct 2 ms 16732 KB ok
5 Correct 2 ms 16728 KB ok
6 Correct 2 ms 16728 KB ok
7 Correct 2 ms 16732 KB ok
8 Correct 2 ms 16728 KB ok
9 Correct 2 ms 16732 KB ok
10 Correct 2 ms 16732 KB ok
11 Correct 2 ms 16732 KB ok
12 Correct 2 ms 16732 KB ok
13 Correct 2 ms 16732 KB ok
14 Correct 2 ms 16732 KB ok
15 Correct 2 ms 16728 KB ok
16 Correct 1 ms 16732 KB ok
17 Correct 2 ms 16732 KB ok
18 Correct 1 ms 16732 KB ok
19 Correct 1 ms 16732 KB ok
20 Correct 2 ms 16732 KB ok
21 Correct 2 ms 16732 KB ok
22 Correct 1 ms 16732 KB ok
23 Correct 1 ms 16900 KB ok
24 Correct 2 ms 16732 KB ok
25 Correct 2 ms 16732 KB ok
26 Correct 1 ms 16732 KB ok
27 Correct 2 ms 16732 KB ok
28 Correct 2 ms 16728 KB ok
29 Correct 1 ms 16732 KB ok
30 Correct 3 ms 25180 KB ok
31 Correct 3 ms 25180 KB ok
32 Correct 3 ms 25020 KB ok
33 Correct 2 ms 24924 KB ok
34 Correct 2 ms 25076 KB ok
35 Correct 3 ms 24924 KB ok
36 Correct 3 ms 24920 KB ok
37 Correct 2 ms 22876 KB ok
38 Correct 2 ms 24924 KB ok
39 Correct 2 ms 24920 KB ok
40 Correct 3 ms 24920 KB ok
41 Correct 2 ms 25176 KB ok
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16732 KB ok
2 Correct 2 ms 16728 KB ok
3 Correct 2 ms 16732 KB ok
4 Correct 2 ms 16732 KB ok
5 Correct 2 ms 16728 KB ok
6 Correct 2 ms 16728 KB ok
7 Correct 2 ms 16732 KB ok
8 Correct 2 ms 16728 KB ok
9 Correct 2 ms 16732 KB ok
10 Correct 2 ms 16732 KB ok
11 Correct 2 ms 16732 KB ok
12 Correct 2 ms 16732 KB ok
13 Correct 2 ms 16732 KB ok
14 Correct 2 ms 16732 KB ok
15 Correct 2 ms 16728 KB ok
16 Correct 1 ms 16732 KB ok
17 Correct 2 ms 16732 KB ok
18 Correct 1 ms 16732 KB ok
19 Correct 1 ms 16732 KB ok
20 Correct 2 ms 16732 KB ok
21 Correct 2 ms 16732 KB ok
22 Correct 1 ms 16732 KB ok
23 Correct 1 ms 16900 KB ok
24 Correct 2 ms 16732 KB ok
25 Correct 2 ms 16732 KB ok
26 Correct 1 ms 16732 KB ok
27 Correct 2 ms 16732 KB ok
28 Correct 2 ms 16728 KB ok
29 Correct 1 ms 16732 KB ok
30 Correct 3 ms 25180 KB ok
31 Correct 3 ms 25180 KB ok
32 Correct 3 ms 25020 KB ok
33 Correct 2 ms 24924 KB ok
34 Correct 2 ms 25076 KB ok
35 Correct 3 ms 24924 KB ok
36 Correct 3 ms 24920 KB ok
37 Correct 2 ms 22876 KB ok
38 Correct 2 ms 24924 KB ok
39 Correct 2 ms 24920 KB ok
40 Correct 3 ms 24920 KB ok
41 Correct 2 ms 25176 KB ok
42 Correct 299 ms 180112 KB ok
43 Correct 214 ms 176032 KB ok
44 Correct 564 ms 184588 KB ok
45 Correct 604 ms 182128 KB ok
46 Correct 409 ms 183244 KB ok
47 Correct 45 ms 159312 KB ok
48 Execution timed out 4548 ms 158792 KB Time limit exceeded
49 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16732 KB ok
2 Correct 2 ms 16728 KB ok
3 Correct 2 ms 16732 KB ok
4 Correct 2 ms 16732 KB ok
5 Correct 2 ms 16728 KB ok
6 Correct 2 ms 14684 KB ok
7 Correct 2 ms 16732 KB ok
8 Correct 5 ms 43612 KB ok
9 Correct 34 ms 159060 KB ok
10 Correct 562 ms 598096 KB ok
11 Correct 2 ms 16728 KB ok
12 Correct 2 ms 16732 KB ok
13 Correct 2 ms 16728 KB ok
14 Correct 2 ms 16732 KB ok
15 Correct 2 ms 16732 KB ok
16 Correct 2 ms 16732 KB ok
17 Correct 2 ms 16732 KB ok
18 Correct 2 ms 16732 KB ok
19 Correct 2 ms 16732 KB ok
20 Correct 2 ms 16728 KB ok
21 Correct 1 ms 16732 KB ok
22 Correct 2 ms 16732 KB ok
23 Correct 1 ms 16732 KB ok
24 Correct 1 ms 16732 KB ok
25 Correct 2 ms 16732 KB ok
26 Correct 2 ms 16732 KB ok
27 Correct 1 ms 16732 KB ok
28 Correct 1 ms 16900 KB ok
29 Correct 2 ms 16732 KB ok
30 Correct 2 ms 16732 KB ok
31 Correct 1 ms 16732 KB ok
32 Correct 2 ms 16732 KB ok
33 Correct 2 ms 16728 KB ok
34 Correct 1 ms 16732 KB ok
35 Correct 3 ms 25180 KB ok
36 Correct 3 ms 25180 KB ok
37 Correct 3 ms 25020 KB ok
38 Correct 2 ms 24924 KB ok
39 Correct 2 ms 25076 KB ok
40 Correct 3 ms 24924 KB ok
41 Correct 3 ms 24920 KB ok
42 Correct 2 ms 22876 KB ok
43 Correct 2 ms 24924 KB ok
44 Correct 2 ms 24920 KB ok
45 Correct 3 ms 24920 KB ok
46 Correct 2 ms 25176 KB ok
47 Correct 299 ms 180112 KB ok
48 Correct 214 ms 176032 KB ok
49 Correct 564 ms 184588 KB ok
50 Correct 604 ms 182128 KB ok
51 Correct 409 ms 183244 KB ok
52 Correct 45 ms 159312 KB ok
53 Execution timed out 4548 ms 158792 KB Time limit exceeded
54 Halted 0 ms 0 KB -