Submission #954626

#TimeUsernameProblemLanguageResultExecution timeMemory
954626waldiArranging Shoes (IOI19_shoes)C++17
100 / 100
285 ms42492 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define FOR(i,p,k) for(int i=(p);i<=(k);++i)
#define REP(i,n) FOR(i,0,(n)-1)
#define ssize(x) (int((x).size()))
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long ll;

struct przedzialowiec{
	int N;
	vector<int> t;
	przedzialowiec(int n){
		for(N = 1; N < n;) N <<= 1;
		t.resize(N<<1, 0);
	}
	void dodaj(int poz, int wart){
		for(poz += N; poz; poz >>= 1) t[poz] += wart;
	}
	int suma(int p, int k){
		int ret = 0;
		for(p+=N, k+=N+1; p<k; p>>=1, k>>=1){
			if(p&1) ret += t[p++];
			if(k&1) ret += t[--k];
		}
		return ret;
	}
};

ll count_swaps(vector<int> wej){
	int n = ssize(wej)>>1;
	
	unordered_map<int, set<int>> mapa;
	REP(i, 2*n) mapa[wej[i]].emplace(i);
	
	ll wyn = 0ll;
	set<int> istnieje;
	przedzialowiec prz(n<<1);
	REP(i, n<<1) prz.dodaj(i, 1), istnieje.emplace(i);
	while(ssize(istnieje)){
		int t = *istnieje.begin();
		int wart = wej[t];
		int poz = *mapa[-wart].begin();
		
		wyn += prz.suma(0, poz-1);
		if(wart < 0) --wyn;
		
		prz.dodaj(t, -1);
		prz.dodaj(poz, -1);
		
		mapa[wart].erase(t);
		mapa[-wart].erase(poz);
		
		istnieje.erase(t);
		istnieje.erase(poz);
	}
	return wyn;
}
#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...