Submission #1076220

#TimeUsernameProblemLanguageResultExecution timeMemory
1076220shmaxArt Class (IOI13_artclass)C++17
100 / 100
66 ms9136 KiB
#include "artclass.h"
#include <bits/stdc++.h>

using namespace std;

template<typename T>
using vec = vector<T>;

typedef struct {
    int r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2) {
    long rmean = ((long) e1.r + (long) e2.r) / 2;
    long r = (long) e1.r - (long) e2.r;
    long g = (long) e1.g - (long) e2.g;
    long b = (long) e1.b - (long) e2.b;
    return sqrt((((512 + rmean) * r * r) >> 8) + 4 * g * g + (((767 - rmean) * b * b) >> 8));
}

int style(int N, int M, int R[500][500], int G[500][500], int B[500][500]) {
    map<tuple<int, int, int>, int> colors;
    vec<vec<tuple<int, int, int>>> mtr(N, vec<tuple<int, int, int>>(M));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            //            colors.insert(fix_color(R[i][j], G[i][j], B[i][j]));
            mtr[i][j] = tuple<int, int, int>(R[i][j], G[i][j], B[i][j]);
        }
    }

    vec<vec<bool>> used(N, vec<bool>(M, false));
    int most_common = 0;

    mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
    auto calc = [&](int kd = 50, bool b = false) -> float {
        auto similar = [&](tuple<int, int, int> a, tuple<int, int, int> b) {
            int r1, g1, b1, r2, g2, b2;
            tie(r1, g1, b1) = a;
            tie(r2, g2, b2) = b;
            int t = ColourDistance({r1, g1, b1}, {r2, g2, b2});
            if (t < kd) return true;
            //            if (t > kd * 2) return false;
            //            return (rnd() % kd) > (t - kd);
            return false;
            //            return  < kd;
        };
        int cnt_min = 1e9;
        int cnt_max = 0;
        {
            for (int i = 0; i < N; i++) {
                int tc = 0;
                for (int j = 0; j < M - 1; j++) {
                    tc += !similar(mtr[i][j], mtr[i][j + 1]);
                }
                cnt_max += tc;
            }
        }
        return (float) cnt_max * 1000 / (M * N);
    };
    auto calc_green = [&]() {
        int cnt = 0;
        int not_green = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                cnt += G[i][j];
                not_green += R[i][j] + B[i][j];


            }
        }
        cnt -= not_green;
        return (float) cnt / (float) (M * N);
    };


    if (calc(100) < 5) return 4;
    if (calc(50) > 390) return 3;
    if (calc_green() > -100) return 2;
    return 1;
//    if(calc(10) > 600) return 2;
//    return 1;
//    if(calc(50) < 50) return 1;
//    if(calc(200) > 10) return 3;
//    return 2;
//    cout << calc(50) << endl;
//    if (calc(100) < 10) return 4;
//    if (calc(150) > 50) return 3;
//    return 2;
    cout << calc_green() << endl;


}

Compilation message (stderr)

artclass.cpp: In lambda function:
artclass.cpp:47:13: warning: unused variable 'cnt_min' [-Wunused-variable]
   47 |         int cnt_min = 1e9;
      |             ^~~~~~~
artclass.cpp: In function 'int style(int, int, int (*)[500], int (*)[500], int (*)[500])':
artclass.cpp:32:9: warning: unused variable 'most_common' [-Wunused-variable]
   32 |     int most_common = 0;
      |         ^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...