답안 #207807

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
207807 2020-03-09T05:14:36 Z tri The Kingdom of JOIOI (JOI17_joioi) C++14
60 / 100
4000 ms 154028 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;

#define pb push_back
#define f first
#define s second

const int MAXN = 2000 + 10;

int H, W;

int grid[MAXN][MAXN];
int taken[MAXN][MAXN];

inline int lin(int i, int j) {
    return i * W + j;
}

inline pi dLin(int x) {
    return {x / W, x % W};
}

inline bool check(int i, int j) {
    if (i - 1 >= 0 && !taken[i - 1][j]) {
        return false;
    }
    if (j - 1 >= 0 && !taken[i][j - 1]) {
        return false;
    }
    return true;
}


// compute min cost assuming TL-BR groups and that TL group is smaller
int compute() {
    memset(taken, 0, sizeof(taken));
    vi nums;

    int cur = grid[0][0];

    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            if (grid[i][j] >= cur) {
                nums.pb(grid[i][j]);
            }
        }
    }

    sort(nums.begin(), nums.end());
    nums.erase(unique(nums.begin(), nums.end()), nums.end());

    priority_queue<pi, vector<pi>, greater<pi>> q;

    q.push({cur, lin(0, 0)});

    set<pi> oth;

    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            oth.insert({grid[i][j], lin(i, j)});
        }
    }

    int cMin = cur;
    int cMax = cur;

    int ans = 1e9;

    for (int uBI = 0; uBI < nums.size(); uBI++) {
        int uB = nums[uBI];

        while (q.size()) {
            pi nxt = q.top();
            if (nxt.f > uB) {
                break;
            }
            q.pop();

            int x = nxt.s;
            pi coor = dLin(x);

            int cV = grid[coor.f][coor.s];

            oth.erase({cV, lin(coor.f, coor.s)});

            cMin = min(cMin, cV);
            cMax = max(cMax, cV);

            taken[coor.f][coor.s] = true;

            if (coor.f + 1 < H && check(coor.f + 1, coor.s)) {
                q.push({grid[coor.f + 1][coor.s], lin(coor.f + 1, coor.s)});
            }
            if (coor.s + 1 < W && check(coor.f, coor.s + 1)) {
                q.push({grid[coor.f][coor.s + 1], lin(coor.f, coor.s + 1)});
            }
        }

        if (oth.size()) {
            int cost = cMax - cMin;
            cost = max(cost, (--oth.end())->f - oth.begin()->f);

            ans = min(ans, cost);
        }
    }
    return ans;
}

void flipMag() {
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            grid[i][j] = 1000000001 - grid[i][j];
        }
    }
}

void flip() {
    for (int j = 0; j < W; j++) {
        for (int i = 0; i < H / 2; i++) {
            int tmp = grid[i][j];
            grid[i][j] = grid[H - 1 - i][j];
            grid[H - 1 - i][j] = tmp;
        }
    }
}


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> H >> W;

    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            cin >> grid[i][j];
        }
    }

    int ans = compute();

    flipMag();
    int ans2 = compute();

    flip();
    int ans3 = compute();

    flipMag();
    int ans4 = compute();

    int fAns = min(min(ans, ans2), min(ans3, ans4));
    cout << fAns << endl;
}

Compilation message

joioi.cpp: In function 'int compute()':
joioi.cpp:79:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int uBI = 0; uBI < nums.size(); uBI++) {
                       ~~~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 16120 KB Output is correct
2 Correct 19 ms 16248 KB Output is correct
3 Correct 20 ms 16248 KB Output is correct
4 Correct 20 ms 16120 KB Output is correct
5 Correct 20 ms 16248 KB Output is correct
6 Correct 20 ms 16248 KB Output is correct
7 Correct 20 ms 16248 KB Output is correct
8 Correct 20 ms 16120 KB Output is correct
9 Correct 20 ms 16248 KB Output is correct
10 Correct 20 ms 16120 KB Output is correct
11 Correct 20 ms 16120 KB Output is correct
12 Correct 20 ms 16124 KB Output is correct
13 Correct 19 ms 16120 KB Output is correct
14 Correct 20 ms 16124 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 16120 KB Output is correct
2 Correct 19 ms 16248 KB Output is correct
3 Correct 20 ms 16248 KB Output is correct
4 Correct 20 ms 16120 KB Output is correct
5 Correct 20 ms 16248 KB Output is correct
6 Correct 20 ms 16248 KB Output is correct
7 Correct 20 ms 16248 KB Output is correct
8 Correct 20 ms 16120 KB Output is correct
9 Correct 20 ms 16248 KB Output is correct
10 Correct 20 ms 16120 KB Output is correct
11 Correct 20 ms 16120 KB Output is correct
12 Correct 20 ms 16124 KB Output is correct
13 Correct 19 ms 16120 KB Output is correct
14 Correct 20 ms 16124 KB Output is correct
15 Correct 22 ms 16376 KB Output is correct
16 Correct 84 ms 18948 KB Output is correct
17 Correct 122 ms 19092 KB Output is correct
18 Correct 117 ms 19104 KB Output is correct
19 Correct 117 ms 19340 KB Output is correct
20 Correct 107 ms 18780 KB Output is correct
21 Correct 120 ms 19200 KB Output is correct
22 Correct 115 ms 19060 KB Output is correct
23 Correct 115 ms 19100 KB Output is correct
24 Correct 101 ms 18764 KB Output is correct
25 Correct 119 ms 19272 KB Output is correct
26 Correct 124 ms 19128 KB Output is correct
27 Correct 121 ms 19192 KB Output is correct
28 Correct 123 ms 19212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 16120 KB Output is correct
2 Correct 19 ms 16248 KB Output is correct
3 Correct 20 ms 16248 KB Output is correct
4 Correct 20 ms 16120 KB Output is correct
5 Correct 20 ms 16248 KB Output is correct
6 Correct 20 ms 16248 KB Output is correct
7 Correct 20 ms 16248 KB Output is correct
8 Correct 20 ms 16120 KB Output is correct
9 Correct 20 ms 16248 KB Output is correct
10 Correct 20 ms 16120 KB Output is correct
11 Correct 20 ms 16120 KB Output is correct
12 Correct 20 ms 16124 KB Output is correct
13 Correct 19 ms 16120 KB Output is correct
14 Correct 20 ms 16124 KB Output is correct
15 Correct 22 ms 16376 KB Output is correct
16 Correct 84 ms 18948 KB Output is correct
17 Correct 122 ms 19092 KB Output is correct
18 Correct 117 ms 19104 KB Output is correct
19 Correct 117 ms 19340 KB Output is correct
20 Correct 107 ms 18780 KB Output is correct
21 Correct 120 ms 19200 KB Output is correct
22 Correct 115 ms 19060 KB Output is correct
23 Correct 115 ms 19100 KB Output is correct
24 Correct 101 ms 18764 KB Output is correct
25 Correct 119 ms 19272 KB Output is correct
26 Correct 124 ms 19128 KB Output is correct
27 Correct 121 ms 19192 KB Output is correct
28 Correct 123 ms 19212 KB Output is correct
29 Execution timed out 4081 ms 154028 KB Time limit exceeded
30 Halted 0 ms 0 KB -