Submission #200505

#TimeUsernameProblemLanguageResultExecution timeMemory
200505gratus907Art Class (IOI13_artclass)C++17
84 / 100
109 ms3448 KiB
#include "artclass.h"
#include <bits/stdc++.h>
using namespace std;
double horizontal_variation[550];
double vertical_variation[550];
double average_green;
double avg_hor[550][3], avg_ver[550][3];
const double cut = 0.05;
const int black_crit = 50;
const int bc_crit = 100;
bool debug = false;
int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]) 
{
    memset(horizontal_variation,0,sizeof(horizontal_variation));
    memset(vertical_variation,0,sizeof(vertical_variation));
    memset(avg_hor,0,sizeof(avg_hor));
    memset(avg_ver,0,sizeof(avg_ver));
    for (int i = 0; i<H; i++)
    {
        for (int j = 0; j<W; j++)
        {
            avg_hor[i][0] += R[i][j];
            avg_hor[i][1] += G[i][j];
            avg_hor[i][2] += B[i][j];
            avg_ver[j][0] += R[i][j];
            avg_ver[j][1] += G[i][j];
            avg_ver[j][2] += B[i][j];
            if (i==H-1)
            {
                avg_ver[j][0] /= H;
                avg_ver[j][1] /= H;
                avg_ver[j][2] /= H;
            }
        }
        avg_hor[i][0] /= W;
        avg_hor[i][1] /= W;
        avg_hor[i][2] /= W;
    }
    
    int bigchange = 0;
    for (int i = 1; i<H; i++)
    {
        double u = 0;
        for (int j = 0; j<3; j++)
        {
            u = max(u, abs(avg_hor[i][j]-avg_hor[i-1][j]));
        }
        if (u > bc_crit)
            bigchange++;
    }
    for (int i = 1; i<W; i++)
    {
        double u = 0;
        for (int j = 0; j<3; j++)
        {
            u = max(u, abs(avg_ver[i][j]-avg_ver[i-1][j]));
        }
        if (u > bc_crit)
            bigchange++;
    }
    if (bigchange>0) return 1;
    if (debug)
        printf("%d big changes\n",bigchange);
    average_green = 0;
    double avg_hor_var = 0, avg_ver_var = 0;
    for (int i = 0; i<H; i++)
    {
        vector <double> tmpval;
        for (int j = 1; j<W; j++)
        {
            double tmp = 0;
            tmp += abs(R[i][j]-R[i][j-1]);
            tmp += abs(G[i][j]-G[i][j-1]);
            tmp += abs(B[i][j]-B[i][j-1]);
            tmpval.push_back(tmp);
        }
        sort(tmpval.begin(), tmpval.end());
        for (int j = (int)(tmpval.size()*cut); j<(int)(tmpval.size()*(1-cut)); j++)
            horizontal_variation[i] += tmpval[j];
        horizontal_variation[i] *= 1/((1-2*cut)*tmpval.size());
        avg_hor_var += pow(horizontal_variation[i],2);
    }
    for (int i = 0; i<W; i++)
    {
        vector <double> tmpval;
        for (int j = 1; j<H; j++)
        {
            double tmp = 0;
            tmp += abs(R[j][i]-R[j-1][i]);
            tmp += abs(G[j][i]-G[j-1][i]);
            tmp += abs(B[j][i]-B[j-1][i]);
            tmpval.push_back(tmp);
        }
        sort(tmpval.begin(), tmpval.end());
        for (int j = (int)(tmpval.size()*cut); j<(int)(tmpval.size()*(1-cut)); j++)
            vertical_variation[i] += tmpval[j];
        vertical_variation[i] *= 1/((1-2*cut)*tmpval.size());
        avg_ver_var += pow(vertical_variation[i],2);
    }
    for (int i = 0; i<H; i++)
    {
        if (horizontal_variation[i]<5) return 4;
    }
    for (int i = 0; i<W; i++)
    {
        if (vertical_variation[i]<5) return 4;
    }
    if (avg_ver_var > 1000000 or avg_ver_var > 1000000) 
        return 3;
    if (avg_hor_var < 10000 or avg_ver_var < 10000)
        return 4;
    if (debug) printf("%.2lf!!\n",sqrt(avg_hor_var));

    return 2;
}
#Verdict Execution timeMemoryGrader output
Fetching results...