제출 #1358637

#제출 시각아이디문제언어결과실행 시간메모리
1358637pcheloveks웜뱃 (IOI13_wombats)C++20
9 / 100
206 ms20148 KiB
#include "wombats.h"
#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9;

int r, c;
int h[5000][200], v[5000][200];
int p[5000][200];

int T[520][10][10];

int F[17][200];

void buildToNode(int val, int tl, int tr) {
    for(int col = 0; col < c; col++) {
        for(int j = 0; j < c; j++) {
            if(j <= col) F[0][j] = p[tl][col] - p[tl][j];
            else F[0][j] = p[tl][j] - p[tl][col];
        }

        for(int i = tl + 1; i <= min(tr + 1, r - 1); i++) {
            int mi = INF;
            for(int j = 0; j < c; j++) {
                mi = min(mi, F[i - tl - 1][j] - p[i][j] + v[i - 1][j]);
                F[i - tl][j] = mi + p[i][j];
            }
            mi = INF;
            for(int j = c - 1; j >= 0; j--) {
                mi = min(mi, F[i - tl - 1][j] + p[i][j] + v[i - 1][j]);
                F[i - tl][j] = min(F[i - tl][j], mi - p[i][j]);
            }
        }
        for(int i = 0; i < c; i++) T[val][col][i] = F[min(tr + 1, r - 1) - tl][i];
    }
}

void merge(int val) {
    for(int i = 0; i < c; i++) {
        for(int j = 0; j < c; j++) {
            T[val][i][j] = INF;
        }
    }

    for(int i = 0; i < c; i++) {
        for(int j = 0; j < c; j++) {
            for(int k = 0; k < c; k++) T[val][i][j] = min(T[val][i][j], T[2 * val + 1][i][k] + T[2 * val + 2][k][j]);
        }
    }
}

void build(int val, int tl, int tr) {
    if(tr - tl + 1 <= 10) {
        buildToNode(val, tl, tr);
        return;
    }

    int tm = (tl + tr) >> 1;
    build(2 * val + 1, tl, tm);
    build(2 * val + 2, tm + 1, tr);

    merge(val);
}

void update(int val, int tl, int tr, int pos) {
    if(tr - tl + 1 <= 10) {
        buildToNode(val, tl, tr);
        return;
    }

    int tm = (tl + tr) >> 1;
    if(pos <= tm) update(2 * val + 1, tl, tm, pos);
    else update(2 * val + 2, tm + 1, tr, pos);

    merge(val);
}

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

    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            h[i][j] = H[i][j];
            v[i][j] = V[i][j];

            if(j >= 1) p[i][j] = p[i][j - 1] + h[i][j - 1];
            else p[i][j] = 0;
        }
    }

    build(0, 0, r - 1);
}

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

    for(int j = 0; j < c; j++) {
        if(j >= 1) p[P][j] = p[P][j - 1] + h[P][j - 1];
        else p[P][j] = 0;
    }

    update(0, 0, r - 1, P);
}

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

    update(0, 0, r - 1, P);
}

int escape(int v1, int v2) {
    return T[0][v1][v2];
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…