Submission #151691

#TimeUsernameProblemLanguageResultExecution timeMemory
151691gs14004Wine Tasting (FXCUP4_wine)C++17
100 / 100
12 ms1024 KiB
#include "bartender.h"
#include <bits/stdc++.h>
#define sz(v) ((int)(v).size())
using namespace std;
using lint = long long;

namespace {
	lint encode(vector<int> v){
		lint tot = 0;
		int cnt = 0;
		for(int i=0; i<sz(v); i++){
			int rk = 0;
			for(int j=0; j<i; j++){
				if(v[j] < v[i]) rk++;
			}
			cnt++;
			tot = tot * cnt + rk;
		}
		return tot;
	}
	vector<int> decode(lint w, int n){
		vector<int> v(n);
		vector<int> lst(n);
		iota(lst.begin(), lst.end(), 1);
		for(int i=n-1; i>=0; i--){
			int md = w % (i + 1);
			w /= i + 1;
			v[i] = lst[md];
			lst.erase(lst.begin() + md);
		}
		return v;
	}
}

std::vector<int> BlendWines(int K, std::vector<int> R){
	int N = R.size();
	vector<int> tmp;
	for(int i=0; i<N; i++){
		if(R[i] > 12) tmp.push_back(R[i] - 12);
	}
	lint tot = encode(tmp);
	vector<int> ans(N);
	for(int i=0; i<N; i++){
		if(R[i] <= 12) ans[i] = 1 + (tot >> (R[i] - 1)) % 2;
	}
	tot >>= 12;
	for(int i=0; i<N; i++){
		if(R[i] > 12){
			ans[i] = 3 + (tot % 5);
			tot /= 5;
		}
	}
	return ans;
}
#include "taster.h"
#include <bits/stdc++.h>
#define sz(v) ((int)(v).size())
using namespace std;
using lint = long long;

namespace {
	lint encode(vector<int> v){
		lint tot = 0;
		int cnt = 0;
		for(int i=0; i<sz(v); i++){
			int rk = 0;
			for(int j=0; j<i; j++){
				if(v[j] < v[i]) rk++;
			}
			cnt++;
			tot = tot * cnt + rk;
		}
		return tot;
	}
	vector<int> decode(lint w, int n){
		vector<int> v(n);
		vector<int> lst(n);
		iota(lst.begin(), lst.end(), 1);
		for(int i=n-1; i>=0; i--){
			int md = w % (i + 1);
			w /= i + 1;
			v[i] = lst[md];
			lst.erase(lst.begin() + md);
		}
		return v;
	}
}

vector<int> mis(vector<int> v){
	if(sz(v) <= 1) return v;
	vector<int> LO, HI;
	for(int i=0; i+1<sz(v); i+=2){
		if(Compare(v[i], v[i + 1]) > 0) swap(v[i], v[i + 1]);
		LO.push_back(v[i]);
		HI.push_back(v[i + 1]);
	}
	if(sz(v) & 1) LO.push_back(v.back());
	HI = mis(HI);
	auto find_match_index = [&](int x){
		int pos = find(v.begin(), v.end(), x) - v.begin();
		pos ^= 1;
		if(pos >= sz(v)) return 987654321;
		int ret = find(HI.begin(), HI.end(), v[pos]) - HI.begin();
		return ret;
	};
	sort(LO.begin(), LO.end(), [&](const int &a, const int &b){
		return find_match_index(a) < find_match_index(b);
	});
	HI.insert(HI.begin(), LO[0]); 
	LO.erase(LO.begin());
	for(auto i : {1, 0, 3, 2, 5, 4}){
		if(i >= sz(LO)) continue;
		int thres = find_match_index(LO[i]);
		thres = min(thres, sz(HI));
		int s = 0, e = thres;
		while(s != e){
			int m = (s+e)/2;
			if(Compare(HI[m], LO[i]) > 0) e = m;
			else s = m + 1;
		}
		HI.insert(HI.begin() + s, LO[i]);
	}
	return HI;
}

vector<int> get_order(vector<int> pos, int n){
	pos = mis(pos);
	vector<int> dap(n);
	for(int i=0; i<sz(pos); i++) dap[pos[i]] = i + 1;
	return dap;
}

std::vector<int> SortWines(int K, std::vector<int> A) {
	int N = sz(A);
	lint tot = 0;
	for(int i=N-1; i>=0; i--){
		if(A[i] > 2){
			tot = tot * 5 + (A[i] - 3);
		}
	}
	tot <<= 12;
	vector<int> find_ord;
	for(int i=0; i<N; i++){
		if(A[i] <= 2){
			find_ord.push_back(i);
		}
	}
	vector<int> ord = get_order(find_ord, N);
	vector<int> ans(N);
	for(int i=0; i<N; i++){
		if(A[i] <= 2){
			ans[i] = ord[i];
			if(A[i] == 2) tot += (1 << (ord[i] - 1));
		}
	}
	if(N > 12){
		auto dec = decode(tot, N - 12);
		reverse(dec.begin(), dec.end());
		for(int i=0; i<N; i++){
			if(A[i] > 2){
				ans[i] = dec.back() + 12;
				dec.pop_back();
			}
		}
	}
	return ans;
}

Compilation message (stderr)

bartender.cpp:21:14: warning: 'std::vector<int> {anonymous}::decode(lint, int)' defined but not used [-Wunused-function]
  vector<int> decode(lint w, int n){
              ^~~~~~

taster.cpp:8:7: warning: 'lint {anonymous}::encode(std::vector<int>)' defined but not used [-Wunused-function]
  lint encode(vector<int> v){
       ^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...