Submission #422946

#TimeUsernameProblemLanguageResultExecution timeMemory
422946donentsetoArranging Shoes (IOI19_shoes)C++14
100 / 100
168 ms139360 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 200005;
int n;
int paired [maxn];
queue <int> q [maxn];

int fenwick [maxn];
void upd (int x){
	while (x <= n){
		fenwick [x] ++;
		x += x & -x;
	}
}
int query (int x){
	int ans = 0;
	while (x > 0){
		ans += fenwick [x];
		x -= x & -x;
	}
	return ans;
}

long long count_swaps (vector <int> a){

	n = a.size ();
	long long ans = 0;
	for (int i = 0; i < n; i ++){
		int size = abs (a [i]);
		if (q [size].empty () || a [q [size].front ()] == a [i]) q [size].push (i);
		else{
			paired [q [size].front ()] = i;
			paired [i] = -1;
			if (a [i] < 0) ans ++;
			q [size].pop ();
		}
	}
	int cnt = 0;
	for (int i = 0; i < n; i ++){
		if (paired [i] == -1) continue;
		ans += cnt * 2;
		ans -= query (paired [i]);
		ans -= query (i);
		upd (paired [i]);
		cnt ++;
	}
	return ans;

}

//int main (){

	//cout << count_swaps ({2, 1, -1, -2}) << '\n';

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