답안 #516431

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
516431 2022-01-21T10:03:16 Z 600Mihnea 웜뱃 (IOI13_wombats) C++17
76 / 100
1199 ms 262148 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 = 5;
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 10 ms 12468 KB Output is correct
2 Correct 7 ms 12516 KB Output is correct
3 Correct 84 ms 14320 KB Output is correct
4 Correct 7 ms 12472 KB Output is correct
5 Correct 8 ms 12532 KB Output is correct
6 Correct 0 ms 204 KB Output is correct
7 Correct 1 ms 304 KB Output is correct
8 Correct 1 ms 304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 288 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1 ms 460 KB Output is correct
5 Correct 1 ms 440 KB Output is correct
6 Correct 2 ms 460 KB Output is correct
7 Correct 1 ms 440 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 460 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 68 ms 1592 KB Output is correct
12 Correct 1 ms 460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 3700 KB Output is correct
2 Correct 79 ms 3672 KB Output is correct
3 Correct 87 ms 3720 KB Output is correct
4 Correct 81 ms 3596 KB Output is correct
5 Correct 85 ms 3688 KB Output is correct
6 Correct 1 ms 308 KB Output is correct
7 Correct 0 ms 204 KB Output is correct
8 Correct 1 ms 204 KB Output is correct
9 Correct 357 ms 3712 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16588 KB Output is correct
2 Correct 10 ms 16564 KB Output is correct
3 Correct 9 ms 16576 KB Output is correct
4 Correct 46 ms 17520 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 86 ms 3716 KB Output is correct
2 Correct 70 ms 3684 KB Output is correct
3 Correct 78 ms 3716 KB Output is correct
4 Correct 82 ms 3680 KB Output is correct
5 Correct 85 ms 3660 KB Output is correct
6 Correct 10 ms 16508 KB Output is correct
7 Correct 9 ms 16544 KB Output is correct
8 Correct 9 ms 16588 KB Output is correct
9 Correct 45 ms 17528 KB Output is correct
10 Correct 9 ms 12516 KB Output is correct
11 Correct 7 ms 12492 KB Output is correct
12 Correct 85 ms 14316 KB Output is correct
13 Correct 7 ms 12492 KB Output is correct
14 Correct 8 ms 12492 KB Output is correct
15 Correct 0 ms 204 KB Output is correct
16 Correct 1 ms 204 KB Output is correct
17 Correct 0 ms 204 KB Output is correct
18 Correct 1 ms 440 KB Output is correct
19 Correct 1 ms 460 KB Output is correct
20 Correct 1 ms 460 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 460 KB Output is correct
24 Correct 1 ms 332 KB Output is correct
25 Correct 87 ms 1664 KB Output is correct
26 Correct 1 ms 460 KB Output is correct
27 Correct 323 ms 3708 KB Output is correct
28 Correct 1178 ms 105396 KB Output is correct
29 Correct 1099 ms 102364 KB Output is correct
30 Correct 1162 ms 102292 KB Output is correct
31 Correct 1164 ms 106232 KB Output is correct
32 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 3708 KB Output is correct
2 Correct 67 ms 3676 KB Output is correct
3 Correct 74 ms 3640 KB Output is correct
4 Correct 83 ms 3712 KB Output is correct
5 Correct 91 ms 3692 KB Output is correct
6 Correct 9 ms 16524 KB Output is correct
7 Correct 13 ms 16604 KB Output is correct
8 Correct 9 ms 16560 KB Output is correct
9 Correct 43 ms 17584 KB Output is correct
10 Correct 7 ms 12476 KB Output is correct
11 Correct 7 ms 12492 KB Output is correct
12 Correct 73 ms 14372 KB Output is correct
13 Correct 11 ms 12492 KB Output is correct
14 Correct 7 ms 12544 KB Output is correct
15 Runtime error 1199 ms 262148 KB Execution killed with signal 9
16 Halted 0 ms 0 KB -