# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1217378 | omsincoconut | Art Class (IOI13_artclass) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
double takepw(double x) {return pow(x, 2);}
double difference_mean(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
double sum = 0;
for (int i = 1; i < H; i++) {
for (int j = 1; j < W; j++) {
sum += takepw(0.299*abs(R[i][j]-R[i-1][j]) + 0.587*abs(G[i][j]-G[i-1][j]) + 0.114*abs(B[i][j]-B[i-1][j]));
sum += takepw(0.299*abs(R[i][j]-R[i][j-1]) + 0.587*abs(G[i][j]-G[i][j-1]) + 0.114*abs(B[i][j]-B[i][j-1]));
}
}
return sum/(H*W);
}
double info[5][2] = {
{0,0},
{546.836, 278.832},
{511.457, 351.962},
{3388.283, 1561.624/2},
{27.279, 20.547/2}
};
double takepw_2(double x) {return pow(x, 1);}
double difference_mean_2(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
double sum = 0;
for (int i = 1; i < H; i++) {
for (int j = 1; j < W; j++) {
sum += takepw_2(0.299*abs(R[i][j]-R[i-1][j]) + 0.587*abs(G[i][j]-G[i-1][j]) + 0.114*abs(B[i][j]-B[i-1][j]));
sum += takepw_2(0.299*abs(R[i][j]-R[i][j-1]) + 0.587*abs(G[i][j]-G[i][j-1]) + 0.114*abs(B[i][j]-B[i][j-1]));
}
}
return sum/(H*W);
}
double info_2[5][2] = {
{0,0},
{11.551, 4.619},
{21.419, 7.205},
{57.704, 15.829},
{3.685, 1.013}
};
int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
double df = difference_mean(H, W, R, G, B);
double cv = 1e9;
int ret = 0;
for (int i = 1; i <= 4; i++) {
double v = (double)abs(df-info[i][0])/info[i][1];
if (v < cv) {
cv = v;
ret = i;
}
}
if (ret == 3 || ret== 4) return ret;
df = difference_mean_2(H, W, R, G, B);
cv = 1e9;
ret = 0;
for (int i = 1; i <= 4; i++) {
double v = (double)abs(df-info_2[i][0])/info_2[i][1];
if (v < cv) {
cv = v;
ret = i;
}
}
return ret;
}
static int DIM[2];
static int R[500][500];
static int G[500][500];
static int B[500][500];
long long readfile(string filename) {
FILE *in = fopen(filename.c_str(), "r");
if(in == NULL) {
puts("Failed to open input file (artclass.txt).");
return 0;
}
if(fscanf(in, "%d%d", DIM, DIM+1) != 2) {
printf("Line 1: H, W must be integers\n");
return 0;
}
if(DIM[0] < 100 || 500 < DIM[0]) {
printf("Line 1: 100 <= H <= 500\n");
return 0;
}
if(DIM[1] < 100 || 500 < DIM[1]) {
printf("Line 1: 100 <= W <= 500\n");
return 0;
}
for(int i = 0; i< DIM[0]; i++) {
for(int j = 0; j < DIM[1]; j++) {
if(fscanf(in, "%d%d%d", &R[i][j], &G[i][j], &B[i][j]) != 3) {
printf("Line %d: R[i][j], G[i][j], B[i][j] must be integers", i*DIM[1]+j+2, i, j);
return 0;
}
if(R[i][j] < 0 || 255 < R[i][j]) {
printf("Line %d: 0 <= R[%d][%d] <= 255", i*DIM[1]+j+2, i, j);
return 0;
}
if(G[i][j] < 0 || 255 < G[i][j]) {
printf("Line %d: 0 <= G[%d][%d] <= 255", i*DIM[1]+j+2, i, j);
return 0;
}
if(B[i][j] < 0 || 255 < B[i][j]) {
printf("Line %d: 0 <= B[%d][%d] <= 255", i*DIM[1]+j+2, i, j);
return 0;
}
}
}
return style(DIM[0], DIM[1], R, G, B);
}
void style_investigate(int query_style) {
long long val[9];
for (int i = 1; i <= 9; i++) {
string filename = "style-" + to_string(query_style) + "\\style-" + to_string(query_style) + "-" + to_string(i) + ".txt";
val[i-1] = readfile(filename);
}
for (int i = 0; i < 9; i++) {
printf("%d %d\n", query_style, val[i]);
}
}
int main() {
for (int i = 1; i <= 4; i++) style_investigate(i);
}