# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1074777 | mc061 | Art Class (IOI13_artclass) | C++17 | 62 ms | 6224 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.
#pragma once
#include <bits/stdc++.h>
#include "artclass.h"
using namespace std;
int diff(array<int, 3> pixel_1, array<int, 3> pixel_2) {
int ret = 0;
for (int i = 0; i < 3; ++i) {
ret += abs(pixel_1[i] - pixel_2[i]);
}
return ret;
}
const int bound = 40;
// int get_diff(int il, int ir, int jl, int jr, int R[500][500], int G[500][500], int B[500][500]) {
// for (int i = il; i < ir; ++i) {
// for (int j = jl; j < jr; ++j) {
// if (i >= il && i < ir && j >= jl && j < jr) {
// ret += diff({R[i][j], G[i][j], B[i][j]}, {R[i][j], G[i][j], B[i][j]});
// }
// }
// }
// }
int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
cout << fixed << setprecision(10);
auto get_sim = [&] (int bound) -> double {
int ret = 0, norm=0;
for (int t = W/4; t < W; t += W/8) {
for (int i = 1; i < H; i += 2) {
int df = diff({R[i][t], G[i][t], B[i][t]}, {R[i-1][t], G[i-1][t], B[i-1][t]});
ret += df <= bound;
norm++;
}
}
return (ret == 0 ? 0 : double(ret)/norm);
};
// cout << get_sim(5) << " " << get_sim(10) << " " << get_sim(15) << " ";
int similarities = 0;
int diffs = 0;
int green = 0;
int tot = 0;
for (int t = W/4; t < W; t += W/8) {
for (int i = 1; i < H; i++) {
int df = diff({R[i][t], G[i][t], B[i][t]}, {R[i-1][t], G[i-1][t], B[i-1][t]});
diffs += df > bound;
similarities += df <= bound;
green += G[i][t] >= R[i][t] && G[i][t] >= B[i][t];
int y = (G[i][t] + B[i][t]) / 2;
if (y >= 200) ++green;
tot++;
}
}
// cerr << "GREEN : " << (double)green/tot << "\n";
// for (int t = 0; t < W; t++) {
// for (int i = 1; i < H; ++i) {
// green += G[i][t] >= 200 && (R[i][t] + B[i][t] <= 100);
// }
// }
// cerr << green << "\n";
// cerr << diffs << " " << similarities << "\n";
double p = (double)diffs / similarities;
// cerr << "prob: " << p << ", res = ";
if (get_sim(15) > 0.91 && p < 0.025) return 4;
if (get_sim(5) + get_sim(10) + get_sim(15) < 0.5 || p >= 0.9) return 3;
if (get_sim(5) > 0.25) return 1;
// if (p > 0.9) {
// return 3;
// }
return 2;
// cout << diffs << " " << similarities << "\n";
// return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |