답안 #1067822

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1067822 2024-08-21T04:01:00 Z Plurm 웜뱃 (IOI13_wombats) C++11
76 / 100
20000 ms 24640 KB
#include "wombats.h"
#include <bits/stdc++.h>
using namespace std;

int block_size;
int num_blocks;
int global_H[5000][200];
int global_V[5000][200];
int qsr[5000][200];
int C;
class BlockAnswer {
  public:
    vector<vector<int>> ans;
    int rs, rt;
    BlockAnswer(int r1, int r2) {
        rs = r1;
        rt = r2;
        ans.resize(C);
        for (int i = 0; i < C; i++) {
            ans[i].resize(C, 1000000000);
        }
    }
    virtual void update_i(int col) {
        vector<int> dpst;
        dpst.resize(C, 1000000000);
        dpst[col] = 0;
        for (int row = rs; row <= rt; row++) {
            vector<int> dpnw;
            dpnw.resize(C, 1000000000);
            int pref = 1000000000;
            for (int nc = 0; nc < C; nc++) {
                pref = min(pref, dpst[nc] - qsr[row][nc]);
                dpnw[nc] =
                    min(dpnw[nc], pref + qsr[row][nc] + global_V[row][nc]);
            }
            pref = 1000000000;
            for (int nc = C - 1; nc >= 0; nc--) {
                pref = min(pref, dpst[nc] + qsr[row][nc]);
                dpnw[nc] =
                    min(dpnw[nc], pref - qsr[row][nc] + global_V[row][nc]);
            }
            swap(dpst, dpnw);
        }
        ans[col] = dpst;
    }
    void update() {
        for (int i = 0; i < C; i++) {
            update_i(i);
        }
    }
};
vector<BlockAnswer> blans;
void dcopt(vector<int> &dpnw, vector<int> &dpst, vector<vector<int>> &cost,
           int ltarget, int rtarget, int lfound, int rfound) {
    if (ltarget > rtarget)
        return;
    int mid = (ltarget + rtarget) / 2;
    int idx = -1;
    for (int oc = lfound; oc <= rfound; oc++) {
        if (dpst[oc] + cost[oc][mid] < dpnw[mid]) {
            dpnw[mid] = dpst[oc] + cost[oc][mid];
            idx = oc;
        }
    }
    dcopt(dpnw, dpst, cost, ltarget, mid - 1, lfound, idx);
    dcopt(dpnw, dpst, cost, mid + 1, rtarget, idx, rfound);
}
class GlobalAnswer : public BlockAnswer {
  public:
    GlobalAnswer() : BlockAnswer(0, 0) {}
    void update_i(int col) override {
        vector<int> dpst;
        dpst.resize(C, 1000000000);
        dpst[col] = 0;
        for (int blk = 0; blk < num_blocks; blk++) {
            vector<int> dpnw;
            dpnw.resize(C, 1000000000);
            // DC opt?
            dcopt(dpnw, dpst, blans[blk].ans, 0, C - 1, 0, C - 1);
            swap(dpst, dpnw);
        }
        ans[col] = dpst;
    }
};
GlobalAnswer *glob;
void init(int R, int C, int H[5000][200], int V[5000][200]) {
    block_size = sqrt(2 * R * max(1.0, log2(C)));
    num_blocks = (R + block_size - 1) / block_size;
    ::C = C;
    memcpy(global_H, H, 5000 * 200 * 4);
    memcpy(global_V, V, 5000 * 200 * 4);
    for (int j = 0; j < C; j++)
        global_V[R - 1][j] = 0;
    for (int j = 0; j < R; j++) {
        qsr[j][0] = 0;
        for (int i = 0; i < C - 1; i++) {
            qsr[j][i + 1] = qsr[j][i] + global_H[j][i];
        }
    }
    for (int i = 0; i < num_blocks; i++) {
        int r1 = i * block_size;
        int r2 = min((i + 1) * block_size - 1, R - 1);
        blans.emplace_back(r1, r2);
        blans.back().update();
    }
    glob = new GlobalAnswer();
    glob->update();
}

void changeH(int P, int Q, int W) {
    global_H[P][Q] = W;
    for (int i = 0; i < C - 1; i++) {
        qsr[P][i + 1] = qsr[P][i] + global_H[P][i];
    }
    blans[P / block_size].update();
    glob->update();
}

void changeV(int P, int Q, int W) {
    global_V[P][Q] = W;
    blans[P / block_size].update();
    glob->update();
}

int escape(int V1, int V2) { return glob->ans[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 15964 KB Output is correct
2 Correct 13 ms 15948 KB Output is correct
3 Correct 46 ms 17620 KB Output is correct
4 Correct 9 ms 16216 KB Output is correct
5 Correct 9 ms 15964 KB Output is correct
6 Correct 5 ms 8280 KB Output is correct
7 Correct 5 ms 8284 KB Output is correct
8 Correct 4 ms 8240 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 8280 KB Output is correct
2 Correct 4 ms 8284 KB Output is correct
3 Correct 3 ms 8284 KB Output is correct
4 Correct 6 ms 8280 KB Output is correct
5 Correct 5 ms 8284 KB Output is correct
6 Correct 5 ms 8284 KB Output is correct
7 Correct 5 ms 8284 KB Output is correct
8 Correct 5 ms 8284 KB Output is correct
9 Correct 5 ms 8280 KB Output is correct
10 Correct 5 ms 8240 KB Output is correct
11 Correct 47 ms 9212 KB Output is correct
12 Correct 4 ms 8280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 122 ms 8540 KB Output is correct
2 Correct 138 ms 8540 KB Output is correct
3 Correct 146 ms 8536 KB Output is correct
4 Correct 136 ms 8540 KB Output is correct
5 Correct 147 ms 8540 KB Output is correct
6 Correct 4 ms 8284 KB Output is correct
7 Correct 3 ms 8284 KB Output is correct
8 Correct 5 ms 8288 KB Output is correct
9 Correct 675 ms 8676 KB Output is correct
10 Correct 4 ms 8284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 20016 KB Output is correct
2 Correct 14 ms 19804 KB Output is correct
3 Correct 14 ms 19804 KB Output is correct
4 Correct 32 ms 20764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 116 ms 8540 KB Output is correct
2 Correct 139 ms 8540 KB Output is correct
3 Correct 136 ms 8540 KB Output is correct
4 Correct 133 ms 8536 KB Output is correct
5 Correct 137 ms 8536 KB Output is correct
6 Correct 13 ms 19804 KB Output is correct
7 Correct 13 ms 19804 KB Output is correct
8 Correct 20 ms 20268 KB Output is correct
9 Correct 34 ms 20568 KB Output is correct
10 Correct 10 ms 15964 KB Output is correct
11 Correct 9 ms 15964 KB Output is correct
12 Correct 44 ms 17672 KB Output is correct
13 Correct 9 ms 15960 KB Output is correct
14 Correct 9 ms 15964 KB Output is correct
15 Correct 4 ms 8240 KB Output is correct
16 Correct 4 ms 8284 KB Output is correct
17 Correct 4 ms 8212 KB Output is correct
18 Correct 5 ms 8284 KB Output is correct
19 Correct 5 ms 8280 KB Output is correct
20 Correct 6 ms 8276 KB Output is correct
21 Correct 4 ms 8284 KB Output is correct
22 Correct 4 ms 8284 KB Output is correct
23 Correct 5 ms 8280 KB Output is correct
24 Correct 4 ms 8280 KB Output is correct
25 Correct 42 ms 9148 KB Output is correct
26 Correct 5 ms 8284 KB Output is correct
27 Correct 676 ms 8468 KB Output is correct
28 Correct 4769 ms 21164 KB Output is correct
29 Correct 4565 ms 18996 KB Output is correct
30 Correct 4393 ms 19312 KB Output is correct
31 Correct 5062 ms 22168 KB Output is correct
32 Correct 5 ms 8284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 117 ms 8540 KB Output is correct
2 Correct 172 ms 8696 KB Output is correct
3 Correct 137 ms 8540 KB Output is correct
4 Correct 136 ms 8688 KB Output is correct
5 Correct 144 ms 8540 KB Output is correct
6 Correct 13 ms 19800 KB Output is correct
7 Correct 16 ms 19904 KB Output is correct
8 Correct 13 ms 19944 KB Output is correct
9 Correct 35 ms 20620 KB Output is correct
10 Correct 10 ms 15964 KB Output is correct
11 Correct 9 ms 15964 KB Output is correct
12 Correct 43 ms 17592 KB Output is correct
13 Correct 9 ms 15964 KB Output is correct
14 Correct 10 ms 16032 KB Output is correct
15 Correct 818 ms 23236 KB Output is correct
16 Execution timed out 20042 ms 24640 KB Time limit exceeded
17 Halted 0 ms 0 KB -