# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
280339 | shayan_p | 미술 수업 (IOI13_artclass) | C++14 | 215 ms | 3664 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// And you curse yourself for things you never done
#include<bits/stdc++.h>
#include "artclass.h"
#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef double ld;
const int maxn = 510, mod = 1e9 + 7, inf = 1e9 + 10;
int n, m;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
bool mark[maxn][maxn];
void dfs(int x, int y, function<bool(int, int, int, int)> same){
queue<pii> q;
q.push({x, y});
mark[x][y] = 1;
while(sz(q)){
x = q.front().F, y = q.front().S;
q.pop();
for(int i = 0; i < 4; i++){
int X = x + dx[i], Y = y + dy[i];
if(X >= 0 && Y >= 0 && X < n && Y < m && same(x, y, X, Y) && !mark[X][Y])
mark[X][Y] = 1, q.push({X, Y});
}
}
}
int style(int n, int m, int R[500][500], int G[500][500], int B[500][500]) {
::n = n, ::m = m;
auto cross = [&](int x, int y, int xx, int yy){
return R[x][y] * R[xx][yy] + G[x][y] * G[xx][yy] + B[x][y] * B[xx][yy];
};
ll sR = 0, sG = 0, sB = 0, sW = 0, sM = 0;
ll green = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
sR+= R[i][j], sG+= G[i][j], sB+= B[i][j], sW+= max({R[i][j], G[i][j], B[i][j]}) - min({R[i][j], G[i][j], B[i][j]}), sM+= min({R[i][j], G[i][j], B[i][j]});
double RR = double(sR) / n/m, GG = double(sG) / n/m, BB = double(sB) / n/m, WW = double(sW) / n / m, MM = double(sM) /n / m;
auto calc_borders = [&](int eps){
int borders = 0;
auto same = [&](int x, int y, int xx, int yy){
return abs(G[x][y] - G[xx][yy]) <= eps;
// return (abs(R[x][y] - R[xx][yy]) <= eps) + (abs(G[x][y] - G[xx][yy]) <= eps) + (abs(B[x][y] - B[xx][yy]) <= eps) >= cnt;
};
for(int i = 0; i < n; i++)
for(int j = 0; j < m-1; j++)
borders+= !same(i, j, i, j+1);
for(int i = 0; i < n-1; i++)
for(int j = 0; j < m; j++)
borders+= !same(i, j, i+1, j);
return double(borders)/n/m;
};
auto calc_comp = [&](int eps){
auto same_dfs = [&](int x, int y, int xx, int yy){
return abs(G[x][y] - G[xx][yy]) <= eps;
};
memset(mark, 0, sizeof mark);
int comp = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(!mark[i][j])
comp++, dfs(i, j, same_dfs);
return comp;
};
int TYPE1 = 0, TYPE2 = 0, TYPE3 = 0, TYPE4 = 0;
if(calc_comp(10) < 100)
TYPE4+= 10;
else if(calc_comp(10) < 1000)
TYPE1+= 10;
if(calc_comp(20) > 20000)
TYPE3+= 10;
if(calc_comp(20) <= 15)
TYPE4+= 10;
if(calc_comp(30) <= 9)
TYPE4+= 10;
if(calc_comp(40) <= 3)
TYPE4+= 10;
if(calc_borders(35) >= 0.5)
TYPE3+= 10;
if(calc_borders(60) <= 1e-8)
TYPE4+= 3;
if(calc_comp(30) > 20000)
TYPE3+= 10;
if(WW > 105)
TYPE4+= 7;
if(BB >= 120)
TYPE1+= 10;
double num = calc_borders(10);
if(0.5 <= num && num <= 0.7)
TYPE2+= 8;
if(0.1 <= num && num <= 0.3)
TYPE1+= 4;
num = calc_borders(20);
if(num > 1)
TYPE3+= 9;
if(0.1 <= num && num <= 0.4)
TYPE2+= 6;
if(num > 1)
TYPE3+= 7;
int MX = max({TYPE1, TYPE2, TYPE3, TYPE4});
// assert(MX);
// assert((MX == TYPE1) + (MX == TYPE2) + (MX == TYPE3) + (MX == TYPE4) == 1);
// cout << TYPE1 << " " << TYPE2 << " " << TYPE3 << " " << TYPE4 << endl;
if(MX == TYPE2)
return 2;
if(MX == TYPE1)
return 1;
if(MX == TYPE3)
return 3;
if(MX == TYPE4)
return 4;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |