제출 #1324128

#제출 시각아이디문제언어결과실행 시간메모리
1324128SSKMFArranging Shoes (IOI19_shoes)C++20
100 / 100
344 ms146792 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

map < int , stack <int> > aparitii;
int suma[200001];

inline int Query (int indice)
{
	int __suma = 0;
	for ( ; indice ; indice ^= (indice & -indice))
		{ __suma += suma[indice]; }

	return __suma;
}

inline void Update (int indice , const int limita)
{
	for ( ; indice <= limita ; indice += (indice & -indice))
		{ suma[indice]++; }
}

long long count_swaps (vector <int> sir)
{
	for (int indice = (int)sir.size() - 1 ; indice >= 0 ; indice--)
		{ aparitii[sir[indice]].push(indice); }

	vector <bool> numerotat(sir.size());
	for (int indice = 0 , valoare = 0 ; indice < (int)sir.size() ; indice++) {
		if (!numerotat[indice])
		{
			const int __indice = aparitii[-sir[indice]].top();
			aparitii[-sir[indice]].pop();
			aparitii[sir[indice]].pop();

			if (sir[indice] > 0) { sir[__indice] = ++valoare; sir[indice] = ++valoare; }
			else { sir[indice] = ++valoare; sir[__indice] = ++valoare; }

			numerotat[__indice] = true;
			numerotat[indice] = true;
		}
	}

	long long necesar = 0;
	for (int indice = (int)sir.size() - 1 ; indice >= 0 ; indice--)
	{
		necesar += Query(sir[indice] - 1);
		Update(sir[indice] , (int)sir.size());
	}

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