# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1076220 | shmax | Art Class (IOI13_artclass) | C++17 | 66 ms | 9136 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |