Submission #169784

#TimeUsernameProblemLanguageResultExecution timeMemory
169784arthur_nascimentoArranging Shoes (IOI19_shoes)C++14
100 / 100
236 ms140408 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define debug printf
#define ll long long
#define maxn 200200
queue<int> st[maxn];

int par[maxn];
int foi[maxn];
int T[maxn];

void upd(int idx,int val){
	idx++;
	while(idx < maxn){
		T[idx] += val;
		idx += (idx&-idx);
	}
}

int get(int idx){ //debug("get %d\n",idx);
	idx++;;
	int r = 0;
	while(idx){
		r += T[idx];
		idx -= (idx&-idx);
	}
	//debug("-> %d\n",r);
	return r;
}

long long count_swaps(std::vector<int> S){

	int n = S.size();
	
	ll ans = 0;

	for(int i=0;i<n;i++){
		//debug("i %d %d\n",i,S[i]);
		int sz = abs(S[i]);
		if(st[sz].size() > 0 && S[st[sz].front()] == - S[i]){
			if(S[i] < 0) ans++;
			par[st[sz].front()] = i;
			//debug("%d - %d\n",st[sz].front(),i);
			st[sz].pop();
		}
		else {
			st[sz].push(i);
			//debug("add\n");
		}
	}
	
	
	
	for(int i=0;i<n;i++) upd(i,1);
	
	for(int i=0;i<n;i++) if(!foi[i]){
		int u = par[i];
		ans += get(u-1) - get(i);
		upd(u,-1);
		foi[u] = 1;
	}
	
	return ans;

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