제출 #355184

#제출 시각아이디문제언어결과실행 시간메모리
355184talant117408미술 수업 (IOI13_artclass)C++17
7 / 100
87 ms24172 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) < 41 && abs(g[nx][ny]-sg) < 41 && abs(b[nx][ny]-sb) < 41){ 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...