Submission #1174933

#TimeUsernameProblemLanguageResultExecution timeMemory
1174933Clan328Arranging Shoes (IOI19_shoes)C++17
50 / 100
1104 ms1114112 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

long long count_swaps(std::vector<int> s) {
	int n = s.size()/2;
	if (n == 0) return 0;

	// Compress
	set<int> visited;
	for (int i = 0; i < 2*n; i++) {
		visited.insert(abs(s[i]));
	}
	map<int, int> mapper;
	int idx = 1;
	for (auto x : visited) {
		mapper[x] = idx++;
	}

	for (int i = 0; i < 2*n; i++) {
		if (s[i] > 0) s[i] = mapper[s[i]];
		else s[i] = -mapper[-s[i]];
	}

	vector<vector<int>> left(n+1), right(n+1);
	for (int i = 0; i < 2*n; i++) {
		if (s[i] < 0) left[abs(s[i])].push_back(i);
		else right[abs(s[i])].push_back(i);
	}

	int curr = -1, calc = 1e7;
	for (int i = 1; i <= n; i++) {
		if (left[i].size() == 0) continue;
		int tmp = left[i][0]+right[i][0]-((left[i][0] < right[i][0])? 1 : 0);
		if (tmp < calc) {
			curr = i;
			calc = tmp;
		}
	}
	
	assert(curr != -1);

	vector<int> newS;
	for (int i = 0; i < 2*n; i++) {
		if (i == left[curr][0]) continue;
		if (i == right[curr][0]) continue;

		newS.push_back(s[i]);
	}

	return calc + count_swaps(newS);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...