Submission #339043

#TimeUsernameProblemLanguageResultExecution timeMemory
339043LucaDantasScales (IOI15_scales)C++17
0 / 100
52 ms620 KiB
#include "scales.h"
#include<bits/stdc++.h>
using namespace std;

#define pb push_back

int W[6], P[7];
// answer(W);

void init(int T) {
	/* ... */
	++T;
}

vector<vector<int>> check_med(int i, array<int,3> val, vector<vector<int>> pos) {
	vector<vector<int>> ans;
	if(i) swap(val[i], val[0]);
	for(vector<int>& v : pos) {
		for(int x = 0; x < 6; x++)
			P[v[x]] = x;
		if(P[val[0]] < max(P[val[1]], P[val[2]]) &&
			P[val[0]] > min(P[val[1]], P[val[2]]))
				ans.pb(v);
	}
	return ans;
}

vector<vector<int>> check_big(int i, array<int,3> val, vector<vector<int>> pos) {
	vector<vector<int>> ans;
	if(i) swap(val[i], val[0]);
	for(vector<int>& v : pos) {
		for(int x = 0; x < 6; x++)
			P[v[x]] = x;
		if(P[val[0]] > max(P[val[1]], P[val[2]]))
				ans.pb(v);
	}
	return ans;
}

vector<vector<int>> check_small(int i, array<int,3> val, vector<vector<int>> pos) {
	vector<vector<int>> ans;
	if(i) swap(val[i], val[0]);
	for(vector<int>& v : pos) {
		for(int x = 0; x < 6; x++)
			P[v[x]] = x;
		if(P[val[0]] < min(P[val[1]], P[val[2]]))
				ans.pb(v);
	}
	return ans;
}

vector<vector<int>> check_4(int i, int resp, array<int,4> val, vector<vector<int>> pos) {
	vector<vector<int>> ans;
	for(vector<int>& v : pos) {
		vector<int> ord;
		for(int x = 0; x < 6; x++)
			if(find(val.begin(), val.end(), v[x]) != val.end())
				ord.pb(v[x]);
		int p = (int)(find(ord.begin(), ord.end(), val[i]) - ord.begin());
		p = (p+1)%4;
		if(val[resp] == ord[p])
			ans.pb(v);
	}
	return ans;
}

void solve(vector<vector<int>> pos, int sz) {
	if(!sz) {
		for(int i = 0; i < 6; i++)
			W[i] = pos[0][i];
		answer(W);
		return;
	}
	for(int mask = 0; mask < (1<<6); mask++) {
		if(__builtin_popcount(mask) == 3) {
			array<int,3> val; int ptr = 0;
			for(int i = 0; i < 6; i++)
				if(mask&(1<<i)) val[ptr++] = i+1;
			// median
			bool ok = 1;
			for(int x : {0, 1, 2})
				if((int)check_med(x, val, pos).size() > sz)
					{ok = 0; break;}
			int tam = 0;
			for(int x : {0, 1, 2})
				tam += (int)check_med(x, val, pos).size();
			if(ok) {
				int opa = getMedian(val[0], val[1], val[2]);
				for(int x : {0, 1, 2})
					if(val[x] == opa) { opa = x; break; }
				solve(check_med(opa, val, pos), sz/3);
				return;
			}
			// greatest
			ok = 1;
			for(int x : {0, 1, 2})
				if((int)check_big(x, val, pos).size() > sz)
					{ok = 0; break;}
			if(ok) {
				int opa = getHeaviest(val[0], val[1], val[2]);
				for(int x : {0, 1, 2})
					if(val[x] == opa) { opa = x; break; }
				solve(check_big(opa, val, pos), sz/3);
				return;
			}
			// smallest
			ok = 1;
			for(int x : {0, 1, 2})
				if((int)check_small(x, val, pos).size() > sz)
					{ok = 0; break;}
			if(ok) {
				int opa = getLightest(val[0], val[1], val[2]);
				for(int x : {0, 1, 2})
					if(val[x] == opa) { opa = x; break; }
				solve(check_small(opa, val, pos), sz/3);
				return;
			}	
		}
		else if(__builtin_popcount(mask) == 4) {
			// check 4
			array<int,4> val; int ptr = 0;
			for(int i = 0; i < 6; i++)
				if(mask&(1<<i)) val[ptr++] = i+1;

			bool ok;
			for(int y : {0, 1, 2, 3}) {
				ok = 1;
				for(int x : {0, 1, 2, 3})
					if(x != y &&(int)check_4(y, x, val, pos).size() > sz)
						{ok = 0; break;}
				if(ok) {
					if(y) swap(val[0], val[y]);
					int opa = getNextLightest(val[1], val[2], val[3], val[0]);
					if(y) swap(val[0], val[y]);
					for(int x : {0, 1, 2, 3})
						if(val[x] == opa) { opa = x; break; }
					solve(check_4(y, opa, val, pos), sz/3);
					return;
				}
			}
		}
	}
}

void orderCoins() {
	vector<int> perm(6);
	iota(perm.begin(), perm.end(), 1);
	vector<vector<int>> pos;
	do { 
		pos.pb(perm);
	} while(next_permutation(perm.begin(), perm.end()));
	array<int,3> val, val2;
	val[0] = 1, val[1] = 2, val[2] = 3;
	val2[0] = 4, val2[1] = 5, val2[2] = 6;
	array<int, 4> val3;
	val3[0] = 1, val3[1] = 2, val3[2] = 3, val3[3] = 4;
	solve(pos, 243);
}
#Verdict Execution timeMemoryGrader output
Fetching results...