Submission #568441

#TimeUsernameProblemLanguageResultExecution timeMemory
568441d4xnArranging Shoes (IOI19_shoes)C++17
10 / 100
1 ms296 KiB
#include "shoes.h"

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

#define vi vector<int>
#define ll long long

long long count_swaps(std::vector<int> s) {
	ll swaps = 0;
	int n = s.size();

	map<int, int> last; // ultima aparicion de zapatilla con sz x
	vi next(n); // idx de la pareja mas cercana de la zapatilla i
	vi nextSame(n); // idx de la zapatilla mas cercana de la misma sz
	for (int i = n-1; i >= 0; i--) {
		last[s[i]] = i;
		next[i] = last[-s[i]];
		nextSame[i] = last[s[i]];
		//next[i] = (last.count(-s[i]) ? last[-s[i]] : -1);
	}

	vi vis(n, 0);
	map<int, int> newNext; // nueva pareja mas cercana para zapatilla de sz x
	for (int i = 0; i < n; i++) {
		if (vis[i]) continue;

		if (newNext.count(s[i])) {
			if (newNext[s[i]] < next[i]) {
				newNext.erase(s[i]);
			}
			else {
				next[i] = newNext[s[i]];
			}
		}
		
		if (s[i] < 0) {
			// buscar zapatilla derecha de sz abs(s[i]) mas cercana
			// y ponerla a la derecha
			int idx = next[i];
			swaps += idx - i - 1;
			newNext[s[i]] = nextSame[idx];
			vis[idx] = 1;
		}
		else {
			// buscar zapatilla izquierda de sz abs(s[i]) mas cercana
			// y ponerla a la izquierda
			int idx = next[i];
			swaps += idx - i;
			newNext[s[i]] = nextSame[idx];
			vis[idx] = 1;
		}
	}

	return swaps;
}
#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...