제출 #250050

#제출 시각아이디문제언어결과실행 시간메모리
250050MarcoMeijer미술 수업 (IOI13_artclass)C++14
6 / 100
115 ms16120 KiB
#include "artclass.h"
#include <bits/stdc++.h>
using namespace std;

//macros
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<ll, ll> lll;
typedef tuple<int, int, int> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<lll> vlll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define RE(a,c) REP(a,0,c)
#define RE1(a,c) REP(a,1,c+1)
#define REI(a,b,c) REP(a,b,c+1)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define INF 1e9
#define pb push_back
#define fi first
#define se second
#define sz size()

double c [500][500][3];
double cd[500][500][3];
int dx[]={-1,0,1,0,1,-1,1,-1};
int dy[]={0,1,0,-1,1,1,-1,-1};
double mult[]={2,2,2,2,1,1,1,1};

int h, w;
bool inside(int x, int y) {return x>=0 && x<h && y>=0 && y<w;}

double examples[4][27] = {{
86.8804, 
55.4539, 
47.2444, 
27.4334, 
19.5586, 
38.1164, 
24.2448, 
32.4171, 
46.568, 
56.8275, 
61.6161, 
56.2133, 
44.0842, 
45.2076, 
41.4799, 
10.9688, 
33.1464, 
69.3415, 
63.8643, 
55.7544, 
73.649, 
7.22159, 
36.1657, 
58.316, 
17.3317, 
42.6255, 
40.9485, 
},
{
16.3541, 
19.9271, 
36.0986, 
13.2304, 
12.0493, 
18.9068, 
32.7128, 
13.1758, 
15.0642, 
20, 
17.2817, 
14.6399, 
19.986, 
20.1402, 
12.9125, 
10.5127, 
6.95448, 
10.7322, 
23.3665, 
24.4908, 
27.8487, 
3.57144, 
3.15323, 
4.66665, 
1.34382, 
0.990829, 
0.77384, 
},
{
10.2524, 
6.48575, 
5.53414, 
25.2778, 
18.6789, 
24.0981, 
17.0978, 
17.5467, 
19.7319, 
19.9207, 
18.7127, 
17.1221, 
18.4707, 
15.6036, 
12.7489, 
11.9682, 
12.4103, 
10.9832, 
27.7819, 
20.0311, 
12.8469, 
18.3125, 
13.9427, 
6.88892, 
4.67113, 
3.05842, 
1.94268, 
},
{
6.03315, 
0.514533, 
1.53856, 
6.90773, 
3.47993, 
0.900075, 
6.00295, 
8.50453, 
3.04516, 
2.9472, 
34.2193, 
49.1408, 
28.119, 
5.95752, 
6.09292, 
3.43875, 
29.5631, 
16.1868, 
24.8666, 
3.35744, 
1.50529, 
10.1493, 
5.1648, 
1.35999, 
13.4199, 
13.6272, 
6.24027, 
}};

int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
    h=H, w=W;
    RE(i,h) RE(j,w) c[i][j][0] = (double)R[i][j]/255.0;
    RE(i,h) RE(j,w) c[i][j][1] = (double)G[i][j]/255.0;
    RE(i,h) RE(j,w) c[i][j][2] = (double)B[i][j]/255.0;
    RE(x,h) RE(y,w) RE(z,3) {
        cd[x][y][z] = 0;
        RE(d,8) {
            int nx=x+dx[d];
            int ny=y+dy[d];
            if(!inside(nx,ny)) continue;
            double dif = (c[ny][nx][z] - c[x][y][z])*mult[d];
            cd[x][y][z] += dif*dif;
        }
    }

    double values[3];
    RE(z,3) {
        double tot=0;
        RE(x,h) RE(y,w) tot+=cd[x][y][z]*cd[x][y][z];
        tot /= double(h*w);
        values[z] = tot;
    }
    
    int ans = 0;
    double closest = INF;
    RE(i,4) {
        double avg[3];
        RE(j,3) avg[j] = 0.0;
        RE(j,9) RE(k,3) avg[k] += examples[i][j*3+k];
        RE(j,3) avg[j] /= 9.0;

        double dist = 0.0;
        RE(k,3) dist += fabs(values[k]-avg[k]);
        if(dist < closest) {
            closest = dist;
            ans = i;
        }
    }
    return ans+1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...