Submission #568450

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

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

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

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

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

	vi vis(n, 0);
	map<ll, ll> newNext; // nueva pareja mas cercana para zapatilla de sz x
	map<ll, ll> newNextSame; // nueva zapatilla igual mas cercana para zapatilla de sz x
	for (ll 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 (newNextSame.count(s[i])) {
			if (newNextSame[s[i]] < nextSame[i]) {
				newNextSame.erase(s[i]);
			}
			else {
				nextSame[i] = newNextSame[s[i]];
			}
		}
		
		// buscar zapatilla derecha de sz abs(s[i]) mas cercana
		// y ponerla a la derecha
		ll idx = next[i];
		swaps += idx - i - 1;

		if (newNextSame.count(-s[i])) {
			if (newNextSame[-s[i]] > nextSame[idx]) {
				nextSame[idx] = newNextSame[-s[i]];
			}
		}

		ll nx = nextSame[idx];
	
		if (newNext.count(s[i])) newNext[s[i]] = max(newNext[s[i]], nx);
		else newNext[s[i]] = nx;

		if (newNextSame.count(-s[i])) newNextSame[-s[i]] = max(newNextSame[-s[i]], nx);
		else newNextSame[-s[i]] = nx;

		vis[idx] = 1;

		if (s[i] > 0) swaps++;
	}

	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...