제출 #1237641

#제출 시각아이디문제언어결과실행 시간메모리
1237641lalig777Arranging Shoes (IOI19_shoes)C++20
100 / 100
87 ms21180 KiB
#include "shoes.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <unordered_set>
#include <queue>
using namespace std;

vector<int>closest;
vector<long long>added(1e6, 0);
vector<bool>puesto;
int n;

void find_next(vector<int>& s){
	unordered_map<int, priority_queue<int> >mapa;
	for (int i=0; i<n; i++){
		int siz=s[i];
		if (mapa.find(-siz)!=mapa.end() and mapa[-siz].size()>0){
			int ind=-mapa[-siz].top();
			mapa[-siz].pop();
			closest[ind]=i;
			closest[i]=ind;
		}else mapa[siz].push(-i);
	}return;
}

long long find_pos(int p, int l, int r, int x){
	if (l==r) return added[p];
	int m=(l+r)/2;
	if (x<=m) return added[p]+find_pos(p*2, l, m, x);
	else return added[p]+find_pos(p*2+1, m+1, r, x);
}

void add(int p, int l, int r, int a, int b){
	if (a<=l && b>=r){
		added[p]++;
		return;
	}else if (b<l || a>r) return;
	int m=(l+r)/2;
	add(p*2, l, m, a, b);
	add(p*2+1, m+1, r, a, b);
	return;
}


long long count_swaps(vector<int> s) {
	n=s.size();
	closest.assign(n, -1);
	puesto.assign(n, false);
	find_next(s);
	//for (int i=0; i<n; i++) cout<<closest[i]<<' ';
	long long int ans=0;
	for (int i=0; i<n; i++){
		if (puesto[i]==true) continue;
		int ind=closest[i];
		puesto[i]=true;
		puesto[ind]=true;
		int posi=i+find_pos(1, 0, n-1, i);
		int posind=ind+find_pos(1, 0, n-1, ind);
		//cout<<posi<<' '<<posind<<endl;
		ans=ans+posind-posi;
		if (s[i]<0) ans--;
		if (i+1<=ind-1) add(1, 0, n-1, i+1, ind-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...