제출 #513606

#제출 시각아이디문제언어결과실행 시간메모리
513606600MihneaArt Class (IOI13_artclass)C++17
100 / 100
128 ms19292 KiB
#include "artclass.h"
#include <bits/stdc++.h>

using namespace std;

/// attention : mean everything
/// clustering

typedef long double ld;

ld getmean(vector<ld> guys) {
  if (guys.empty()) {
    return 0;
  }
  ld sum = 0;
  for (auto &x : guys) {
    sum += x;
  }
  sum /= (ld) ((int) guys.size());
  return sum;
}

const int C = 2;

ld devi(int type, int n, int m, int a[500][500]) {
  if (type == 0) {
    vector<ld> all;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        if (i + 1 < n) all.push_back(abs(a[i][j] - a[i + 1][j]));
        if (j + 1 < m) all.push_back(abs(a[i][j] - a[i][j + 1]));
      }
    }
    return getmean(all);
  }
  if (type == 1) {
    vector<ld> all;
    for (int i = 1; i + 1 < n; i++) {
      for (int j = 1; j + 1 < m; j++) {
        ld sum = 0;
        sum += a[i - 1][j - 1] + a[i - 1][j] + a[i - 1][j + 1];
        sum += a[i][j - 1] + a[i][j] + a[i][j + 1];
        sum += a[i + 1][j - 1] + a[i + 1][j] + a[i + 1][j + 1];
        all.push_back(abs(a[i][j] - sum / 9));
      }
    }
    return getmean(all);
  }
  assert(0);
}

vector<ld> rr[C][5];
vector<ld> gg[C][5];
vector<ld> bb[C][5];
ld devi_r[C][5];
ld devi_g[C][5];
ld devi_b[C][5];

bool gen = 0;
int step = 0;

void loaddata();

int style(int n, int m, int r[500][500], int g[500][500], int b[500][500]) {
  if (gen) {
    int type = step / 9 + 1;
    step++;
    for (int u = 0; u < C; u++) {
      rr[u][type].push_back(devi(u, n, m, r));
      gg[u][type].push_back(devi(u, n, m, g));
      bb[u][type].push_back(devi(u, n, m, b));
    }
    if (step == 4 * 9) {
      for (int u = 0; u < C; u++) {
        for (int i = 1; i <= 4; i++) {
          cout << "devi_r[" << u << "][" << i << "] = " << getmean(rr[u][i]) << ";\n";
          cout << "devi_g[" << u << "][" << i << "] = " << getmean(gg[u][i]) << ";\n";
          cout << "devi_b[" << u << "][" << i << "] = " << getmean(bb[u][i]) << ";\n";
        }
      }
    }
  } else {
    loaddata();
    for (int u = 0; u < C; u++) {
      devi_r[u][0] = devi(u, n, m, r);
      devi_g[u][0] = devi(u, n, m, g);
      devi_b[u][0] = devi(u, n, m, b);
    }
    ld min_loss = (ld) 1e9;
    int sol = -1;
    for (int type = 1; type <= 4; type++) {
      ld loss = 0;
      for (int u = 0; u < C; u++) {
        loss += abs(devi_r[u][0] - devi_r[u][type]);
        loss += abs(devi_g[u][0] - devi_g[u][type]);
        loss += abs(devi_b[u][0] - devi_b[u][type]);
      }
      if (loss < min_loss) {
        min_loss = loss;
        sol = type;
      }
    }
    assert(sol != -1);
    assert(1 <= sol && sol <= 4);
    return sol;
  }
  return 777;
}

void loaddata() {
  devi_r[0][1] = 5.76637;
  devi_g[0][1] = 5.73766;
  devi_b[0][1] = 6.20445;
  devi_r[0][2] = 10.9656;
  devi_g[0][2] = 10.7493;
  devi_b[0][2] = 10.217;
  devi_r[0][3] = 29.1632;
  devi_g[0][3] = 29.0347;
  devi_b[0][3] = 28.3929;
  devi_r[0][4] = 1.95037;
  devi_g[0][4] = 1.76529;
  devi_b[0][4] = 2.04362;
  devi_r[1][1] = 3.97219;
  devi_g[1][1] = 3.99654;
  devi_b[1][1] = 4.11924;
  devi_r[1][2] = 6.91017;
  devi_g[1][2] = 6.85403;
  devi_b[1][2] = 6.68645;
  devi_r[1][3] = 19.0843;
  devi_g[1][3] = 19.0358;
  devi_b[1][3] = 18.7323;
  devi_r[1][4] = 1.25593;
  devi_g[1][4] = 1.09269;
  devi_b[1][4] = 1.22006;
}
#Verdict Execution timeMemoryGrader output
Fetching results...