제출 #425315

#제출 시각아이디문제언어결과실행 시간메모리
425315frodakcin미술 수업 (IOI13_artclass)C++17
34 / 100
3874 ms8156 KiB
#include "artclass.h"
#include <random>
#include <chrono>
#include <vector>
#include <algorithm>

std::mt19937 rng(std::chrono::high_resolution_clock::now().time_since_epoch().count());

int style(int H, int W, int R[500][500], int G[500][500], int B[500][500])
{
	auto dist=[&](int a, int b, int x, int y)->double
	{
		double d2=0;
		d2 += (R[a][b]-R[x][y])*(R[a][b]-R[x][y]);
		d2 += (G[a][b]-G[x][y])*(G[a][b]-G[x][y]);
		d2 += (B[a][b]-B[x][y])*(B[a][b]-B[x][y]);
		return sqrt(d2);
	};

	auto logistic=[&](double x)->double
	{
		const double x0 = 0;
		const double rt = 0.2;
		return 1/(1+exp((x-x0)*rt));
	};

	// differentiate between 1/4 and 2/3
	double wtdif = 0;
	for(int i=0;i+1<H;++i)
		for(int j=0;j<W;++j)
			wtdif += logistic(dist(i, j, i+1, j));
	wtdif /= (H-1)*W;

	// return (int)(wtdif*10000); // CUT: 1800

	if(wtdif < 0.18)
	{ // styles 2 or 3
		/*
		double green_factor = 0;
		for(int i=0;i<H;++i)
			for(int j=0;j<W;++j)
				green_factor += (double)G[i][j]/(R[i][j]+G[i][j]+B[i][j]+1);
		green_factor /= H*W;
		*/

		std::vector<double> vars;

		int L = ((H+W)/2)/20;
		for(int i=L;i+L<=H;++i)
			for(int j=L;j+L<=W;++j)
			{
				auto var_col = [&](int col[500][500])->double
				{
					double mean = 0;
					for(int u=i-L;u<i+L;++u)
						for(int v=j-L;v<j+L;++v)
							mean += col[u][v];
					mean /= L*L*4;

					double var = 0;
					for(int u=i-L;u<i+L;++u)
						for(int v=j-L;v<j+L;++v)
							var += (col[u][v]-mean)*(col[u][v]-mean);
					var /= L*L*4;
					return var;
				};

				double var_cur=0;
				var_cur += var_col(R);
				var_cur += var_col(G);
				var_cur += var_col(B);
				vars.push_back(var_cur);
			}
		std::sort(vars.begin(), vars.end());

		
		//return (int)(vars[vars.size()/4]);
		//return (int)(green_factor*1000);

		if(vars[vars.size()/4] < 3200)
			return 2;
		else
			return 3;
	}
	else
	{ // styles 1 or 4
		double variance = 0;

		auto var_col = [&](int col[500][500])->double
		{
			double mean = 0;
			for(int u=0;u<H;++u)
				for(int v=0;v<W;++v)
					mean += col[u][v];
			mean /= H*W;

			double var = 0;
			for(int u=0;u<H;++u)
				for(int v=0;v<W;++v)
					var += (col[u][v]-mean)*(col[u][v]-mean);
			var /= H*W;
			return var;
		};

		variance += var_col(R);
		variance += var_col(G);
		variance += var_col(B);
		
		if(variance < 10000)
			return 1;
		else
			return 4;
	}
	return -1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...