Submission #1064006

#TimeUsernameProblemLanguageResultExecution timeMemory
1064006jamjanekArranging Shoes (IOI19_shoes)C++14
100 / 100
87 ms22572 KiB
#include "shoes.h"
#include<bits/stdc++.h>
using namespace std;
bool usu[200010];
set<int>zbiory[200010];
const int base = 1<<18;
int tree[2*base];
int odczyt(int x){
	x+=base;
	int res = 0;
	while(x>0){
//		printf("%d: %d\n", x, tree[x]);
		res+=tree[x];
		x/=2;
	}
	return res;
}
void odejmij(int w, int l, int p, int a, int b){
	if(p<a || b<l)return ;
	if(a<=l && p<=b){
		tree[w]--;
		return;
	}
	odejmij(w*2, l, (l+p)/2, a, b);
	odejmij(w*2+1, (l+p)/2+1, p, a, b);
}
long long count_swaps(std::vector<int> s) {
	int n = s.size()/2;
	for(int i=0;i<2*n;i++){
		zbiory[s[i]+n].insert(i);
		tree[i+base] = i;
	}
	long long wynik = 0;
	for(int start = 0; start<2*n;start++){
		if(usu[start])continue;
		int kolor = s[start];
		int pierwsza = *zbiory[n-kolor].begin();
//		printf("%d %d %d  %d\n", start, kolor, pierwsza, odczyt(pierwsza));
		if(kolor>0)wynik++;
		wynik+=odczyt(pierwsza)-1;
		odejmij(1, 0, base-1, start, base-1);
		odejmij(1, 0, base-1, pierwsza, base-1);
		zbiory[n-kolor].erase(pierwsza);
		zbiory[kolor+n].erase(start);
		usu[start] = 1;
		usu[pierwsza] = 1;
//		printf("%d\n", wynik);
	}
	return wynik;
}
#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...