답안 #680067

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
680067 2023-01-09T20:55:30 Z bashkort 웜뱃 (IOI13_wombats) C++17
100 / 100
11900 ms 138024 KB
#include <bits/stdc++.h>
#include "wombats.h"

using namespace std;

inline bool ckmin(int &a, int b) {
    return (a > b) && (a = b, true);
}

constexpr int B = 32, R = 5000, C = 200, K = (R + B - 1) / B;
const int N = K * 2;

int r, c, need, sz = 1;
int dp[2 * N][C][C], fr[N][C][C], H[R][C], V[R][C];


void pull(int x) {
    memset(dp[x], 0x3f, sizeof(dp[x]));

    if (dp[x << 1 | 1][0][0] == -1) {
        memcpy(dp[x], dp[x << 1], sizeof(dp[x]));
        return;
    }

    for (int cc = 0; cc < c; ++cc) {
        auto solve = [&](auto solve, int l, int r, int optl, int optr) -> void {
            if (l >= r) {
                return;
            }

            int mid = (l + r) >> 1;

            int opt = optl;

            for (int b = optl; b <= optr; ++b) {
                if (ckmin(dp[x][cc][mid], dp[x << 1][cc][b] + dp[x << 1 | 1][b][mid])) {
                    opt = b;
                }
            }

            solve(solve, l, mid, optl, opt), solve(solve, mid + 1, r, opt, optr);
        };
        solve(solve, 0, c, 0, c - 1);
    }
}

void update_fr(int L) {
    if (L < 0) {
        return;
    }

    int lim = max(0, B * L - 1);

    if (lim < r) {
        memset(fr[L], 0x3f, sizeof(fr[L]));
        for (int a = 0; a < c; ++a) {
            fr[L][a][a] = 0;
        }

        for (int i = min(r, B * (L + 1)) - 1; i >= lim; --i) {
            for (int a = 0; a < c - 1; ++a) {
                for (int cc = 0; cc < c; ++cc) {
                    ckmin(fr[L][a + 1][cc], fr[L][a][cc] + H[i][a]);
                }
            }
            for (int a = c - 2; a >= 0; --a) {
                for (int cc = 0; cc < c; ++cc) {
                    ckmin(fr[L][a][cc], fr[L][a + 1][cc] + H[i][a]);
                }
            }
            if (i != lim) {
                for (int a = 0; a < c; ++a) {
                    for (int cc = 0; cc < c; ++cc) {
                        fr[L][a][cc] += V[i - 1][a];
                    }
                }
            }
        }
    } else {
        memset(fr[L], -1, sizeof(fr[L]));
    }

    memcpy(dp[sz + L], fr[L], sizeof(dp[sz + L]));

    for (int x = sz + L; x >>= 1;) {
        pull(x);
    }
}

void init(int R, int C, int H[5000][200], int V[5000][200]) {
    r = R, c = C;
    memcpy(::H, H, sizeof(::H)), memcpy(::V, V, sizeof(::V));

    need = 1 + r / B;
    sz = 1 << __lg(need) + bool(need & (need - 1));
    for (int i = 0; i < sz; ++i) {
        update_fr(i);
    }
}

void changeH(int P, int Q, int W) {
    H[P][Q] = W;

    int L = P / B;

    update_fr(L);
    if ((P + 1) % B == 0 && L + 1 < need) {
        update_fr(L + 1);
    }
}

void changeV(int P, int Q, int W) {
    V[P][Q] = W;

    int L = (P + 1) / B;

    update_fr(L);
}

int escape(int V1, int V2) {
    return dp[1][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;
      |      ^~~
wombats.cpp: In function 'void init(int, int, int (*)[200], int (*)[200])':
wombats.cpp:95:26: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   95 |     sz = 1 << __lg(need) + bool(need & (need - 1));
      |               ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 101 ms 132092 KB Output is correct
2 Correct 107 ms 132156 KB Output is correct
3 Correct 163 ms 133876 KB Output is correct
4 Correct 114 ms 132156 KB Output is correct
5 Correct 96 ms 132152 KB Output is correct
6 Correct 5 ms 8372 KB Output is correct
7 Correct 5 ms 8472 KB Output is correct
8 Correct 6 ms 8404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 8404 KB Output is correct
2 Correct 6 ms 8404 KB Output is correct
3 Correct 4 ms 8372 KB Output is correct
4 Correct 5 ms 8504 KB Output is correct
5 Correct 6 ms 8500 KB Output is correct
6 Correct 6 ms 8404 KB Output is correct
7 Correct 5 ms 8404 KB Output is correct
8 Correct 5 ms 8404 KB Output is correct
9 Correct 5 ms 8404 KB Output is correct
10 Correct 5 ms 8500 KB Output is correct
11 Correct 69 ms 9852 KB Output is correct
12 Correct 5 ms 8504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 182 ms 10100 KB Output is correct
2 Correct 154 ms 10088 KB Output is correct
3 Correct 161 ms 10100 KB Output is correct
4 Correct 159 ms 10104 KB Output is correct
5 Correct 208 ms 10100 KB Output is correct
6 Correct 6 ms 8360 KB Output is correct
7 Correct 4 ms 8452 KB Output is correct
8 Correct 5 ms 8404 KB Output is correct
9 Correct 677 ms 10224 KB Output is correct
10 Correct 5 ms 8368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 104 ms 136136 KB Output is correct
2 Correct 99 ms 136024 KB Output is correct
3 Correct 128 ms 136104 KB Output is correct
4 Correct 175 ms 137040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 165 ms 10188 KB Output is correct
2 Correct 141 ms 10092 KB Output is correct
3 Correct 163 ms 10108 KB Output is correct
4 Correct 228 ms 10104 KB Output is correct
5 Correct 160 ms 10012 KB Output is correct
6 Correct 107 ms 136092 KB Output is correct
7 Correct 98 ms 136092 KB Output is correct
8 Correct 129 ms 136008 KB Output is correct
9 Correct 162 ms 137068 KB Output is correct
10 Correct 98 ms 132124 KB Output is correct
11 Correct 102 ms 132160 KB Output is correct
12 Correct 224 ms 133928 KB Output is correct
13 Correct 138 ms 132156 KB Output is correct
14 Correct 97 ms 132044 KB Output is correct
15 Correct 5 ms 8404 KB Output is correct
16 Correct 5 ms 8416 KB Output is correct
17 Correct 5 ms 8372 KB Output is correct
18 Correct 6 ms 8404 KB Output is correct
19 Correct 6 ms 8404 KB Output is correct
20 Correct 5 ms 8404 KB Output is correct
21 Correct 5 ms 8404 KB Output is correct
22 Correct 6 ms 8404 KB Output is correct
23 Correct 5 ms 8404 KB Output is correct
24 Correct 5 ms 8404 KB Output is correct
25 Correct 69 ms 9728 KB Output is correct
26 Correct 5 ms 8404 KB Output is correct
27 Correct 779 ms 10100 KB Output is correct
28 Correct 2162 ms 136892 KB Output is correct
29 Correct 2318 ms 75404 KB Output is correct
30 Correct 2795 ms 135488 KB Output is correct
31 Correct 2791 ms 138024 KB Output is correct
32 Correct 5 ms 8404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 160 ms 10100 KB Output is correct
2 Correct 146 ms 10096 KB Output is correct
3 Correct 217 ms 10104 KB Output is correct
4 Correct 158 ms 10116 KB Output is correct
5 Correct 161 ms 10108 KB Output is correct
6 Correct 104 ms 136020 KB Output is correct
7 Correct 111 ms 136084 KB Output is correct
8 Correct 134 ms 136104 KB Output is correct
9 Correct 133 ms 137044 KB Output is correct
10 Correct 100 ms 132120 KB Output is correct
11 Correct 108 ms 132120 KB Output is correct
12 Correct 181 ms 133952 KB Output is correct
13 Correct 116 ms 132156 KB Output is correct
14 Correct 106 ms 132156 KB Output is correct
15 Correct 3219 ms 136492 KB Output is correct
16 Correct 10602 ms 137748 KB Output is correct
17 Correct 5 ms 8404 KB Output is correct
18 Correct 4 ms 8404 KB Output is correct
19 Correct 4 ms 8404 KB Output is correct
20 Correct 5 ms 8404 KB Output is correct
21 Correct 5 ms 8404 KB Output is correct
22 Correct 5 ms 8404 KB Output is correct
23 Correct 5 ms 8404 KB Output is correct
24 Correct 5 ms 8404 KB Output is correct
25 Correct 5 ms 8404 KB Output is correct
26 Correct 4 ms 8404 KB Output is correct
27 Correct 77 ms 9420 KB Output is correct
28 Correct 5 ms 8404 KB Output is correct
29 Correct 674 ms 10028 KB Output is correct
30 Correct 2214 ms 136376 KB Output is correct
31 Correct 9294 ms 136632 KB Output is correct
32 Correct 10765 ms 136668 KB Output is correct
33 Correct 2172 ms 74832 KB Output is correct
34 Correct 8591 ms 75312 KB Output is correct
35 Correct 2597 ms 134992 KB Output is correct
36 Correct 10671 ms 135272 KB Output is correct
37 Correct 2746 ms 137396 KB Output is correct
38 Correct 10274 ms 137500 KB Output is correct
39 Correct 4 ms 8404 KB Output is correct
40 Correct 11900 ms 135416 KB Output is correct