Submission #484773

#TimeUsernameProblemLanguageResultExecution timeMemory
484773imachugScales (IOI15_scales)C++17
55.56 / 100
1 ms204 KiB
#include "scales.h"

#include <bits/stdc++.h>

using namespace std;


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


void order3(int a, int b, int c, int* w) {
	w[0] = getLightest(a, b, c);
	w[1] = getMedian(a, b, c);
	w[2] = a + b + c - w[0] - w[1];
}


void order6(int a, int b, int c, int d, int e, int f, int* w) {
	int w1[3];
	int w2[3];
	order3(a, b, c, w1);
	order3(d, e, f, w2);


	vector<int> w_(w1, w1 + 3);

	auto insert_single = [&](int l, int r, int x) {
		if(l == r) {
			w_.insert(w_.begin() + l, x);
		} else if(r - l == 1) {
			// Two variants: single comparison
			bool is_x_less_than_wl = (
				l > 0 ? getHeaviest(w_[0], w_[l], x) == w_[l] :
				getLightest(w_[2], w_[l], x) == x
			);
			if(is_x_less_than_wl) {
				w_.insert(w_.begin() + l, x);
			} else {
				w_.insert(w_.begin() + r, x);
			}
		} else if(r - l == 2) {
			// Two variants
			int median = getMedian(w_[l], x, w_[l + 1]);
			if(median == w_[l]) {
				w_.insert(w_.begin() + l, x);
			} else if(median == x) {
				w_.insert(w_.begin() + l + 1, x);
			} else {
				w_.insert(w_.begin() + r, x);
			}
		} else if(r - l == 3) {
			int y = getNextLightest(w_[l], w_[l + 1], w_[l + 2], x);
			if(y != w_[l]) {
				// Insert just before y
				w_.insert(find(w_.begin(), w_.end(), y), x);
			} else {
				// Either less than everything or greater than everything
				bool is_x_less_than_wl = (
					l > 0 ? getHeaviest(w_[0], w_[l], x) == w_[l] :
					getLightest(w_[2], w_[l], x) == x
				);
				if(is_x_less_than_wl) {
					// Insert just before the first one
					w_.insert(w_.begin() + l, x);
				} else {
					// insert to the end
					w_.insert(w_.begin() + r, x);
				}
			}
		} else {
			assert(false);
		}
	};


	// Insert w2[1]
	int y = getNextLightest(a, b, c, w2[1]);
	if(y != w1[0]) {
		// Exact known point
		int idx = find(w1, w1 + 3, y) - w1;
		w_.insert(w_.begin() + idx, w2[1]);
		// Insert w2[0] and w2[2]
		insert_single(idx + 1, 4, w2[2]);
		insert_single(0, idx, w2[0]);
	} else {
		// Either less than everything or greater than everything
		bool is_w2_1_less_than_w1_0 = getLightest(w1[0], w1[1], w2[1]) == w2[1];
		if(is_w2_1_less_than_w1_0) {
			// Less than everything
			insert_single(0, 3, w2[2]);
			w_.insert(w_.begin(), w2[1]);
			w_.insert(w_.begin(), w2[0]);
		} else {
			// Greater than everything
			insert_single(0, 3, w2[0]);
			w_.push_back(w2[1]);
			w_.push_back(w2[2]);
		}
	}


	copy(w_.begin(), w_.end(), w);
}


void orderCoins() {
	int W[6];
	order6(1, 2, 3, 4, 5, 6, W);
	answer(W);
}

Compilation message (stderr)

scales.cpp: In function 'void init(int)':
scales.cpp:8:15: warning: unused parameter 'T' [-Wunused-parameter]
    8 | void init(int T) {
      |           ~~~~^
scales.cpp: In function 'void order6(int, int, int, int, int, int, int*)':
scales.cpp:82:33: warning: conversion from 'long int' to 'int' may change value [-Wconversion]
   82 |   int idx = find(w1, w1 + 3, y) - w1;
      |             ~~~~~~~~~~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...