# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1076220 | shmax | 미술 수업 (IOI13_artclass) | C++17 | 66 ms | 9136 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |