Submission #1074777

#TimeUsernameProblemLanguageResultExecution timeMemory
1074777mc061Art Class (IOI13_artclass)C++17
82 / 100
62 ms6224 KiB
#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)

artclass.cpp:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...