제출 #355201

#제출 시각아이디문제언어결과실행 시간메모리
355201talant117408Art Class (IOI13_artclass)C++17
10 / 100
91 ms25964 KiB
#include "artclass.h"
#ifndef EVAL
#include "grader.cpp"
#endif
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
 
#define precision(n) fixed << setprecision(n)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define mp make_pair
#define eps (double)1e-9
#define PI 2*acos(0.0)
#define endl "\n"
#define sz(v) int((v).size())
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define OK cout << "OK" << endl;

int cnt = 1, sr, sg, sb;
int n, m;
int used[501][501], r[501][501], g[501][501], b[501][501];
int movesX[] = {-1, 0, 0, 1}, movesY[] = {0, -1, 1, 0};

bool isEligible(int x, int y){
    return x > -1 && x < n && y > -1 && y < m;
}

void dfs(int x, int y){
    used[x][y] = cnt;
    for(int i = 0; i < 4; i++){
        auto nx = x+movesX[i];
        auto ny = y+movesY[i];
        if(isEligible(nx, ny) && !used[nx][ny] && abs(r[nx][ny]-sr) < 50 && abs(g[nx][ny]-sg) < 50 && abs(b[nx][ny]-sb) < 50){
            dfs(nx, ny);
        }
    }
}

int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]){
    n = H; m = W;
    int i, j;
    for(i = 0; i < n; i++){
        for(j = 0; j < m; j++){
            r[i][j] = R[i][j];
            g[i][j] = G[i][j];
            b[i][j] = B[i][j];
        }
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(!used[i][j]){
                sr = r[i][j];
                sg = g[i][j];
                sb = b[i][j];
                dfs(i, j);
                cnt++;
            }
        }
    }
    
    if(cnt < 300){
        int mn[500*500+2][3], mx[500*500+2][3];
        memset(mn, 2e9, sizeof(mn));
        memset(mx, 0, sizeof(mx));
        for(i = 0; i < n; i++){
            for(j = 0; j < m; j++){
                mn[used[i][j]][0] = min(mn[used[i][j]][0], r[i][j]);
                mx[used[i][j]][0] = max(mx[used[i][j]][0], r[i][j]);
                mn[used[i][j]][1] = min(mn[used[i][j]][1], g[i][j]);
                mx[used[i][j]][1] = max(mx[used[i][j]][1], g[i][j]);
                mn[used[i][j]][2] = min(mn[used[i][j]][2], b[i][j]);
                mx[used[i][j]][2] = max(mx[used[i][j]][2], b[i][j]);
            }
        }
        int ans = 0;
        for(int i = 0; i < 500*500+2; i++){
            ans = max(ans, mx[i][0]-mn[i][0]);
            ans = max(ans, mx[i][1]-mn[i][1]);
            ans = max(ans, mx[i][2]-mn[i][2]);
        }
        if(ans < 30) return 1;
        return 4;
    }
    else{
        double green = 0, red = 0, blue = 0;
        for(i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                green += g[i][j];
                red += r[i][j];
                blue += b[i][j];
            }
        }
        green /= double(n*m);
        red /= double(n*m);
        blue /= double(n*m);
        if(green >= red && green >= blue)
            return 2;
        return 3;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...