제출 #426566

#제출 시각아이디문제언어결과실행 시간메모리
426566Aldas25미술 수업 (IOI13_artclass)C++14
49 / 100
79 ms5236 KiB
#include "artclass.h"
#include <bits/stdc++.h>

using namespace std;

#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define REP(n) FOR(O, 1, (n))
#define f first
#define s second
#define pb push_back
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vii;
typedef long long ll;
typedef vector<ll> vl;
typedef long double ld;

int id (int i, int j) {
    return i * 510 + j;
}

int par[520*520], sz[520*520];
int find (int a) {return par[a] = par[a]==a ? a : find(par[a]);}
bool same (int a, int b) {return find(a) == find(b);}
void unite (int a, int b) {
    a = find(a); b = find(b);
    if (a == b) return;
    par[b] = a;
    sz[a] += sz[b];
}

int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {

    ll sumR = 0, sumG = 0, sumB = 0;
    FOR(i, 0, H-1) FOR(j, 0, W-1) {
        sumR += R[i][j];
        sumG += G[i][j];
        sumB += B[i][j];
        par[id(i,j)] = id(i,j);
        sz[id(i,j)] = 1;
    }

    //cout << " sumR = " << sumR << " sumG = " << sumG << " sumB = " << sumB << endl;
    ll area = ((ll)H)*((ll)W);
    ld avR = ((ld)sumR) / ((ld)area);
    ld avG = ((ld)sumG) / ((ld)area);
    ld avB = ((ld)sumB) / ((ld)area);
    //cout << fixed << setprecision(3) << " avR = " << avR << " avG = " << avG << " avB = " << avB << endl;

    ll maxD = 50;
    FOR(i, 0, H-1) FOR(j, 0, W-1) {
        if (i < H-1) {
            int d = 0;
            //d = abs(R[i][j] - R[i+1][j]) + abs(G[i][j] - G[i+1][j]) + abs(B[i][j] - B[i+1][j]);
            d = max(d, abs(R[i][j] - R[i+1][j]));
            d = max(d, abs(G[i][j] - G[i+1][j]));
            d = max(d, abs(B[i][j] - B[i+1][j]));
            if (d <= maxD)
                unite(id(i,j), id(i+1,j));
        }

        if (j < W-1) {
            int d = 0;
            d = max(d, abs(R[i][j] - R[i][j+1]));
            d = max(d, abs(G[i][j] - G[i][j+1]));
            d = max(d, abs(B[i][j] - B[i][j+1]));
            if (d <= maxD)
                unite(id(i,j), id(i,j+1));
        }
    }

    int conComponents = 0;
    FOR(i, 0, H-1) FOR(j, 0, W-1) {
        if (find(id(i,j)) != id(i,j)) continue;
        conComponents++;
    }

   // cout << " CC: " << conComponents << "\n";

    if (conComponents <= 3) return 4;
    else if (avB < min(avR, avG) - 25.0) return 2;
    else if (conComponents <= 10) return 4;
    else if (conComponents <= 500) return 1;
    else return 3;
    //cout << " ans = " << ans << endl;

    //return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...