답안 #516429

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
516429 2022-01-21T10:01:53 Z 600Mihnea 웜뱃 (IOI13_wombats) C++17
100 / 100
4683 ms 186848 KB
#include "wombats.h"
#include <bits/stdc++.h>

using namespace std;

const int N = 5000 + 7;
const int M = 200 + 7;
const int INF = (int) 1e9 + 7;
const int BUCKETSIZE = 10;
int H[N][M];
int V[N][M];

int n;
int m;

struct Node {
  int l;
  int r;
  vector<vector<int>> cost;
  Node() :
    l(0),
    r(0),
    cost(m, vector<int> (m, INF)) {
  }
};

vector<Node> tree;

void placeSmall(Node &guy, int l, int r) {
  guy.l = l;
  guy.r = r;
  for (int start = 0; start < m; start++) {
    for (int col = 0; col < m; col++) {
      guy.cost[start][col] = INF;
    }
    guy.cost[start][start] = 0;
    for (int col = 1; col < m; col++) {
      guy.cost[start][col] = min(guy.cost[start][col], guy.cost[start][col - 1] + H[l][col - 1]);
    }
    for (int col = m - 2; col >= 0; col--){
      guy.cost[start][col] = min(guy.cost[start][col], guy.cost[start][col + 1] + H[l][col]);
    }
  }
  for (int row = l + 1; row <= r; row++) {
    /// add row j
    for (int start = 0; start < m; start++) {
      for (int col = 0; col < m; col++) {
        guy.cost[start][col] += V[row - 1][col];
      }
      for (int col = 1; col < m; col++) {
        guy.cost[start][col] = min(guy.cost[start][col], guy.cost[start][col - 1] + H[row][col - 1]);
      }
      for (int col = m - 2; col >= 0; col--){
        guy.cost[start][col] = min(guy.cost[start][col], guy.cost[start][col + 1] + H[row][col]);
      }
    }
  }
}

int A[M][M];
int B[M][M];
int opt[M][M];


void join(Node& solution, Node& lft, Node& rgh) {
  solution.l = lft.l;
  solution.r = rgh.r;
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
      A[i][j] = lft.cost[i][j] + V[lft.r][j];
      B[i][j] = rgh.cost[i][j];
      solution.cost[i][j] = INF;
      opt[i][j] = -1;
    }
  }
  for (int i = 0; i < m; i++) {
    for (int k = m - 1; k >= 0; k--) {
      int nd = m - 1, st = 0;
      if (k + 1 < m) {
        nd = opt[i][k + 1];
      }
      if (i - 1 >= 0) {
        st = opt[i - 1][k];
      }
      for (int j = st; j <= nd; j++) {
        if (A[i][j] + B[j][k] < solution.cost[i][k]) {
          solution.cost[i][k] = A[i][j] + B[j][k];
          opt[i][k] = j;
        }
      }
    }
  }
}



void update(int v, int tl, int tr, int pos) {
  int LEN = tr - tl + 1;
  if (LEN <= BUCKETSIZE) {
    placeSmall(tree[v], tl, tr);
    return;
  }
  int tm = (tl + tr) / 2;
  if (pos <= tm) {
    update(2 * v, tl, tm, pos);
  } else {
    update(2 * v + 1, tm + 1, tr, pos);
  }
  join(tree[v], tree[2 * v], tree[2 * v + 1]);

}

void build(int v, int tl, int tr) {
  while (v >= (int) tree.size()) tree.push_back({});
  if (tr - tl + 1 <= BUCKETSIZE) {

    placeSmall(tree[v], tl, tr);

    return;
  }
  int tm = (tl + tr) / 2;
  build(2 * v, tl, tm);
  build(2 * v + 1, tm + 1, tr);
  join(tree[v], tree[2 * v], tree[2 * v + 1]);
}


void init(int R, int C, int Hinit[5000][200], int Vinit[5000][200]) {
  n = R;
  m = C;
  for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) H[i][j] = Hinit[i][j], V[i][j] = Vinit[i][j];
  build(1, 0, n - 1);
}

void changeH(int P, int Q, int W) {
  H[P][Q] = W;
  update(1, 0, n - 1, P);
}

void changeV(int P, int Q, int W) {
  V[P][Q] = W;
  update(1, 0, n - 1, P);
}

int escape(int V1, int V2) {
  return tree[1].cost[V1][V2];
}

Compilation message

grader.c: In function 'int main()':
grader.c:15:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
   15 |  int res;
      |      ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 12364 KB Output is correct
2 Correct 6 ms 12324 KB Output is correct
3 Correct 71 ms 14020 KB Output is correct
4 Correct 6 ms 12364 KB Output is correct
5 Correct 6 ms 12364 KB Output is correct
6 Correct 0 ms 204 KB Output is correct
7 Correct 0 ms 204 KB Output is correct
8 Correct 0 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 332 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 0 ms 332 KB Output is correct
7 Correct 1 ms 332 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 332 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 66 ms 1320 KB Output is correct
12 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 2136 KB Output is correct
2 Correct 80 ms 2252 KB Output is correct
3 Correct 93 ms 2268 KB Output is correct
4 Correct 114 ms 2252 KB Output is correct
5 Correct 91 ms 2168 KB Output is correct
6 Correct 0 ms 204 KB Output is correct
7 Correct 0 ms 204 KB Output is correct
8 Correct 0 ms 204 KB Output is correct
9 Correct 387 ms 2268 KB Output is correct
10 Correct 0 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 16332 KB Output is correct
2 Correct 8 ms 16340 KB Output is correct
3 Correct 8 ms 16332 KB Output is correct
4 Correct 41 ms 17132 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 2184 KB Output is correct
2 Correct 84 ms 2252 KB Output is correct
3 Correct 90 ms 2256 KB Output is correct
4 Correct 96 ms 2256 KB Output is correct
5 Correct 91 ms 2252 KB Output is correct
6 Correct 8 ms 16332 KB Output is correct
7 Correct 8 ms 16332 KB Output is correct
8 Correct 8 ms 16376 KB Output is correct
9 Correct 41 ms 17156 KB Output is correct
10 Correct 6 ms 12436 KB Output is correct
11 Correct 6 ms 12364 KB Output is correct
12 Correct 69 ms 14008 KB Output is correct
13 Correct 6 ms 12364 KB Output is correct
14 Correct 6 ms 12416 KB Output is correct
15 Correct 0 ms 204 KB Output is correct
16 Correct 0 ms 204 KB Output is correct
17 Correct 0 ms 204 KB Output is correct
18 Correct 1 ms 332 KB Output is correct
19 Correct 1 ms 332 KB Output is correct
20 Correct 1 ms 332 KB Output is correct
21 Correct 1 ms 332 KB Output is correct
22 Correct 1 ms 332 KB Output is correct
23 Correct 1 ms 332 KB Output is correct
24 Correct 1 ms 332 KB Output is correct
25 Correct 67 ms 1348 KB Output is correct
26 Correct 1 ms 332 KB Output is correct
27 Correct 376 ms 2252 KB Output is correct
28 Correct 1184 ms 61088 KB Output is correct
29 Correct 1067 ms 58164 KB Output is correct
30 Correct 1103 ms 58072 KB Output is correct
31 Correct 1235 ms 61892 KB Output is correct
32 Correct 0 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 89 ms 2268 KB Output is correct
2 Correct 95 ms 2252 KB Output is correct
3 Correct 90 ms 2252 KB Output is correct
4 Correct 91 ms 2252 KB Output is correct
5 Correct 89 ms 2252 KB Output is correct
6 Correct 9 ms 16332 KB Output is correct
7 Correct 12 ms 16356 KB Output is correct
8 Correct 8 ms 16332 KB Output is correct
9 Correct 41 ms 17180 KB Output is correct
10 Correct 6 ms 12364 KB Output is correct
11 Correct 6 ms 12364 KB Output is correct
12 Correct 73 ms 13960 KB Output is correct
13 Correct 6 ms 12324 KB Output is correct
14 Correct 8 ms 12364 KB Output is correct
15 Correct 1920 ms 184996 KB Output is correct
16 Correct 4672 ms 186848 KB Output is correct
17 Correct 0 ms 204 KB Output is correct
18 Correct 0 ms 204 KB Output is correct
19 Correct 0 ms 204 KB Output is correct
20 Correct 1 ms 332 KB Output is correct
21 Correct 1 ms 460 KB Output is correct
22 Correct 1 ms 332 KB Output is correct
23 Correct 1 ms 332 KB Output is correct
24 Correct 1 ms 332 KB Output is correct
25 Correct 1 ms 332 KB Output is correct
26 Correct 1 ms 332 KB Output is correct
27 Correct 67 ms 1356 KB Output is correct
28 Correct 1 ms 332 KB Output is correct
29 Correct 380 ms 2268 KB Output is correct
30 Correct 1170 ms 61004 KB Output is correct
31 Correct 4519 ms 185796 KB Output is correct
32 Correct 4683 ms 185740 KB Output is correct
33 Correct 1082 ms 58076 KB Output is correct
34 Correct 4081 ms 183080 KB Output is correct
35 Correct 1089 ms 58172 KB Output is correct
36 Correct 4189 ms 182940 KB Output is correct
37 Correct 1241 ms 61928 KB Output is correct
38 Correct 4556 ms 186560 KB Output is correct
39 Correct 1 ms 204 KB Output is correct
40 Correct 4279 ms 183076 KB Output is correct