Submission #1212032

#TimeUsernameProblemLanguageResultExecution timeMemory
1212032alex_2008Scales (IOI15_scales)C++20
0 / 100
45 ms576 KiB
#include "scales.h"
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <algorithm>
#include <iomanip>
#include <set>
#include <map>
#include <deque>
#include <queue>
#define ff first
#define ss second
typedef long long ll;
typedef long double ld;
using namespace std;
const int N = 1e5 + 10;
void init(int T) {
	return;
}
vector <int> ans;
void rec(vector<vector<int>> current_states) {
	if ((int)current_states.size() == 1) {
		ans = current_states[0];
		return;
	}
	vector <vector<int>> best_case = current_states;
	string type = "unknown"; 
	int A, B, C, D;
	//Lightest
	for (int a = 1; a <= 6; a++) {
		for (int b = 1; b <= 6; b++) {
			for (int c = 1; c <= 6; c++) {
				if (a == b || a == c || b == c) continue;
				vector <vector<int>> f, s, t;
				for (auto &it : current_states) {
					int indA, indB, indC;
					for (int j = 0; j < 6; j++) {
						if (it[j] == a) indA = j;
						if (it[j] == b) indB = j;
						if (it[j] == c) indC = j;
					}
					if (indA < indB && indA < indC) {
						f.push_back(it);
					}
					else if (indB < indA && indB < indC) {
						s.push_back(it);
					}
					else t.push_back(it);
				}
				if ((int)f.size() < (int)s.size()) swap(f, s);
				if ((int)f.size() < (int)t.size()) swap(f, t);
				if ((int)f.size() < (int)best_case.size()) {
					best_case = f;
					type = "Light";
					A = a;
					B = b;
					C = c;
				}
			}
		}
	}
	//Heaviest
	for (int a = 1; a <= 6; a++) {
		for (int b = 1; b <= 6; b++) {
			for (int c = 1; c <= 6; c++) {
				if (a == b || a == c || b == c) continue;
				vector <vector<int>> f, s, t;
				for (auto& it : current_states) {
					int indA, indB, indC;
					for (int j = 0; j < 6; j++) {
						if (it[j] == a) indA = j;
						if (it[j] == b) indB = j;
						if (it[j] == c) indC = j;
					}
					if (indA > indB && indA > indC) {
						f.push_back(it);
					}
					else if (indB > indA && indB > indC) {
						s.push_back(it);
					}
					else t.push_back(it);
				}
				if ((int)f.size() < (int)s.size()) swap(f, s);
				if ((int)f.size() < (int)t.size()) swap(f, t);
				if ((int)f.size() < (int)best_case.size()) {
					best_case = f;
					type = "Heavy";
					A = a;
					B = b;
					C = c;
				}
			}
		}
	}
	//Median
	for (int a = 1; a <= 6; a++) {
		for (int b = 1; b <= 6; b++) {
			for (int c = 1; c <= 6; c++) {
				if (a == b || a == c || b == c) continue;
				vector <vector<int>> f, s, t;
				for (auto& it : current_states) {
					int indA, indB, indC;
					for (int j = 0; j < 6; j++) {
						if (it[j] == a) indA = j;
						if (it[j] == b) indB = j;
						if (it[j] == c) indC = j;
					}
					if (indA > min(indB, indC) && indA < max(indC, indB)) {
						f.push_back(it);
					}
					else if (indB > min(indA, indC) && indB < max(indA, indC)) {
						s.push_back(it);
					}
					else t.push_back(it);
				}
				if ((int)f.size() < (int)s.size()) swap(f, s);
				if ((int)f.size() < (int)t.size()) swap(f, t);
				if ((int)f.size() < (int)best_case.size()) {
					best_case = f;
					type = "Median";
					A = a;
					B = b;
					C = c;
				}
			}
		}
	}
	//nextLightest
	for (int a = 1; a <= 6; a++) {
		for (int b = 1; b <= 6; b++) {
			for (int c = 1; c <= 6; c++) {
				for (int d = 1; d <= 6; d++) {
					if (a == b || a == c || b == c) continue;
					if (a == d || b == d || c == d) continue;
					vector <vector<int>> f, s, t;
					for (auto& it : current_states) {
						int indA, indB, indC, indD;
						for (int j = 0; j < 6; j++) {
							if (it[j] == a) indA = j;
							if (it[j] == b) indB = j;
							if (it[j] == c) indC = j;
							if (it[j] == d) indD = j;
						}
						int mn = 1000;
						if (indA > indD) mn = min(mn, indA);
						if (indB > indD) mn = min(mn, indB);
						if (indC > indD) mn = min(mn, indC);
						if (mn == 1000) {
							f.push_back(it);
						}
						else if (mn == indA) {
							f.push_back(it);
						}
						else if (mn == indB) {
							s.push_back(it);
						}
						else t.push_back(it);
					}
					if ((int)f.size() < (int)s.size()) swap(f, s);
					if ((int)f.size() < (int)t.size()) swap(f, t);
					if ((int)f.size() < (int)best_case.size()) {
						best_case = f;
						type = "nextLightest";
						A = a;
						B = b;
						C = c;
						D = d;
					}
				}
			}
		}
	}
	vector <vector<int>> nxt_case;
	if (type == "Light") {
		int u = getLightest(A, B, C);
		vector <vector<int>> f, s, t;
		for (auto& it : current_states) {
			int indA, indB, indC;
			for (int j = 0; j < 6; j++) {
				if (it[j] == A) indA = j;
				if (it[j] == B) indB = j;
				if (it[j] == C) indC = j;
			}
			if (indA < indB && indA < indC) {
				f.push_back(it);
			}
			else if (indB < indA && indB < indC) {
				s.push_back(it);
			}
			else t.push_back(it);
		}
		if (u == A) nxt_case = f;
		else if (u == B) nxt_case = s;
		else nxt_case = t;
	}
	else if (type == "Heavy") {
		int u = getHeaviest(A, B, C);
		vector <vector<int>> f, s, t;
		for (auto& it : current_states) {
			int indA, indB, indC;
			for (int j = 0; j < 6; j++) {
				if (it[j] == A) indA = j;
				if (it[j] == B) indB = j;
				if (it[j] == C) indC = j;
			}
			if (indA > indB && indA > indC) {
				f.push_back(it);
			}
			else if (indB > indA && indB > indC) {
				s.push_back(it);
			}
			else t.push_back(it);
		}
		if (u == A) nxt_case = f;
		else if (u == B) nxt_case = s;
		else nxt_case = t;
	}
	else if (type == "Median") {
		int u = getMedian(A, B, C);
		vector <vector<int>> f, s, t;
		for (auto& it : current_states) {
			int indA, indB, indC;
			for (int j = 0; j < 6; j++) {
				if (it[j] == A) indA = j;
				if (it[j] == B) indB = j;
				if (it[j] == C) indC = j;
			}
			if (indA > min(indB, indC) && indA < max(indC, indB)) {
				f.push_back(it);
			}
			else if (indB > min(indA, indC) && indB < max(indA, indC)) {
				s.push_back(it);
			}
			else t.push_back(it);
		}
		if (u == A) nxt_case = f;
		else if (u == B) nxt_case = s;
		else nxt_case = t;
	}
	else {
		int u = getNextLightest(A, B, C, D);
		vector <vector<int>> f, s, t;
		for (auto& it : current_states) {
			int indA, indB, indC, indD;
			for (int j = 0; j < 6; j++) {
				if (it[j] == A) indA = j;
				if (it[j] == B) indB = j;
				if (it[j] == C) indC = j;
				if (it[j] == D) indD = j;
			}
			int mn = 1000;
			if (indA > indD) mn = min(mn, indA);
			if (indB > indD) mn = min(mn, indB);
			if (indC > indD) mn = min(mn, indC);
			if (mn == 1000) {
				if (indA < indB && indA < indC) {
					f.push_back(it);
				}
				else if (indB < indA && indB < indC) {
					s.push_back(it);
				}
				else {
					t.push_back(it);
				}
			}
			else if (mn == indA) {
				f.push_back(it);
			}
			else if (mn == indB) {
				s.push_back(it);
			}
			else t.push_back(it);
		}
		if (u == A) nxt_case = f;
		else if (u == B) nxt_case = s;
		else nxt_case = t;
	}
	rec(nxt_case);
}
void orderCoins() {
	vector <int> v(6);
	for (int i = 0; i < 6; i++) {
		v[i] = i + 1;
	}
	vector <vector<int>> esim;
	while (1) {
		esim.push_back(v);
		if (!next_permutation(v.begin(), v.end())) break;
	}
	rec(esim);	
}
#Verdict Execution timeMemoryGrader output
Fetching results...