Submission #1341566

#TimeUsernameProblemLanguageResultExecution timeMemory
1341566omsincoconutArt Class (IOI13_artclass)C++20
67 / 100
100 ms3604 KiB
#include <bits/stdc++.h>
#include "artclass.h"

using namespace std;

int count_component(int H, int W, int R[500][500], int G[500][500], int B[500][500], int delta) {
    bool vis[500][500];
    memset(vis, 0, sizeof(vis));

    auto color_sum = [&](int x, int y) {
        return R[x][y] + G[x][y] + B[x][y];
    };

    int ret = 0;
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            if (vis[i][j]) continue;
            ret++;

            queue<pair<int, int>> bfs;
            bfs.emplace(i, j);
            while (!bfs.empty()) {
                auto [x, y] = bfs.front();
                bfs.pop();
                if (vis[x][y]) continue;
                vis[x][y] = true;

                int dx[] = {-1, 0, 1, 0};
                int dy[] = {0, -1, 0, 1};
                for (int d = 0; d < 4; d++) {
                    int nx = x + dx[d];
                    int ny = y + dy[d];

                    if (nx < 0 || nx >= H || ny < 0 || ny >= W) continue;
                    if (abs(color_sum(x, y) - color_sum(nx, ny)) <= delta) {
                        bfs.emplace(nx, ny);
                    }
                }
            }
        }
    }

    return ret;
}

double info_16[5][2] = {
    {0,0},
    {13010.111, 11730.387},
    {58501.000, 24981.392},
    {91721.667, 24119.511},
    {617.333, 525.352}
};

double info_64[5][2] = {
    {0,0},
    {2117.778, 3741.400},
    {2733.667, 3466.084},
    {25493.556, 12126.989},
    {4.333, 4.387}
};

int get_best(int H, int W, int R[500][500], int G[500][500], int B[500][500], vector<int> can, int delta, double info[5][2]) {
    int cnt = count_component(H, W, R, G, B, delta);

    double cv = 1e9;
    int ret = 0;
    for (int i : can) {
        double v = (double)abs(cnt-info[i][0])/info[i][1];
        if (v < cv) {
            cv = v;
            ret = i;
        }
    }
    return ret;
}

int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
    int stage_1 = get_best(H, W, R, G, B, {1, 2, 3, 4}, 16, info_16);

    if (stage_1 == 1) {
        // candidate = {1, 4}
        return get_best(H, W, R, G, B, {1, 4}, 64, info_64);
    } else if (stage_1 == 2) {
        // candidate = {1, 2, 3}
        return 2;
    } else if (stage_1 == 3) {
        // candidate = {2, 3}
        return get_best(H, W, R, G, B, {2, 3}, 64, info_64);
    } else {
        // candidate = {4}
        return 4;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...