Submission #1218695

#TimeUsernameProblemLanguageResultExecution timeMemory
1218695viduxScales (IOI15_scales)C++17
55.56 / 100
1 ms328 KiB
#include "scales.h"

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;
typedef vector<ll> vl;

const ll LLINF = 1e18;

void init(int T) {

}

void orderCoins() {
	int a1[3], a2[3];
	{
		set<int> s = {1, 2, 3, 4, 5, 6};
		a1[0] = getLightest(1, 2, 3);
		a2[0] = getLightest(4, 5, 6);
		a1[1] = getMedian(1, 2, 3);
		a2[1] = getMedian(4, 5, 6);
		s.erase(a1[0]);
		s.erase(a2[0]);
		s.erase(a1[1]);
		s.erase(a2[1]);
		a1[2] = *s.begin();
		a2[2] = *s.rbegin();
	}

    	int ans[6] = {0};
	set<int> s1 = {1, 2, 3}, s2 = {4, 5, 6};
	{
		int midMn = getMedian(a1[0], a1[1], a2[0]);
		if (midMn == a1[0]) {
			ans[0] = a2[0];
			s2.erase(a2[0]);
		}
		if (midMn == a1[1]) {
			ans[0] = a1[0];
			ans[1] = a1[1];
			s1.erase(a1[0]);
			s1.erase(a1[1]);
		}
		if (midMn == a2[0]) {
			ans[0] = a1[0];
			ans[1] = a2[0];
			s1.erase(a1[0]);
			s2.erase(a2[0]);
		}
	}
	{
		int midMn = getMedian(a1[2], a2[1], a2[2]);
		if (midMn == a2[2]) {
			ans[5] = a1[2];
			s1.erase(a1[2]);
		}
		if (midMn == a2[1]) {
			ans[5] = a2[2];
			ans[4] = a2[1];
			s2.erase(a2[2]);
			s2.erase(a2[1]);
		}
		if (midMn == a1[2]) {
			ans[5] = a2[2];
			ans[4] = a1[2];
			s2.erase(a2[2]);
			s1.erase(a1[2]);
		}
	}
	if (s1.size() > s2.size()) {
		swap(s1, s2);
		swap(a1, a2);
	}
	if ((int)s1.size() == 2 && (int)s2.size() == 2) {
		vector<int> miss1, miss2;
		for (int i = 0; i < 3; i++) {
			if (s1.count(a1[i])) miss1.push_back(a1[i]);
			if (s2.count(a2[i])) miss2.push_back(a2[i]);
		}
		int mn = getLightest(miss1[0], miss2[0], miss1[1]);
		for (int i = 0; i < 6; i++) if (!ans[i]) {
			ans[i] = mn;
			break;
		}
		s1.erase(mn);
		s2.erase(mn);
	}
	if (s1.size() > s2.size()) {
		swap(s1, s2);
		swap(a1, a2);
	}
	if ((int)s1.size() == 1 && (int)s2.size() == 2) {
		vector<int> a, b;
		for (int i = 0; i < 3; i++) {
			if (s1.count(a1[i])) a.push_back(a1[i]);
			if (s2.count(a2[i])) b.push_back(a2[i]);
		}
		vector<int> ord(3);
		int midMn = getMedian(a[0], b[0], b[1]);
		if (midMn == a[0]) {
			ord[0] = b[0];
			ord[1] = a[0];
			ord[2] = b[1];
		}
		if (midMn == b[0]) {
			ord[0] = a[0];
			ord[1] = b[0];
			ord[2] = b[1];
		}
		if (midMn == b[1]) {
			ord[0] = b[0];
			ord[1] = b[1];
			ord[2] = a[0];
		}
		s1.erase(a[0]);
		s2.erase(b[0]);
		s2.erase(b[1]);
		reverse(ord.begin(), ord.end());
		for (int i = 0; i < 6; i++) if (!ans[i]) {
			ans[i] = ord.back();
			ord.pop_back();
		}
	}
	if ((int)s1.size() == 1 && (int)s2.size() == 1) {
		int mn = getLightest(*s1.begin(), *s2.begin(), ans[5]);
		vector<int> ord;
		if (mn == *s1.begin()) ord = {*s1.begin(), *s2.begin()};
		else ord = {*s2.begin(), *s1.begin()};
		reverse(ord.begin(), ord.end());
		for (int i = 0; i < 6; i++) if (!ans[i]) {
			ans[i] = ord.back();
			ord.pop_back();
		}
	}
	if ((int)s1.size() == 0) {
		vector<int> missing;
		for (int i = 0; i < 3; i++)
			if (s2.count(a2[i])) 
				missing.push_back(a2[i]);
		reverse(missing.begin(), missing.end());
		for (int i = 0; i < 6; i++) {
			if (!ans[i]) {
				ans[i] = missing.back();
				missing.pop_back();
			}
		}
	}
	//for (int i = 0; i < 6; i++) cout << ans[i] << " "; cout << endl;
    	answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...