Submission #1047400

#TimeUsernameProblemLanguageResultExecution timeMemory
1047400Kel_MahmutArranging Shoes (IOI19_shoes)C++14
45 / 100
74 ms23888 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define pb push_back
// #define endl ("\n")
#define all(aa) aa.begin(), aa.end()
typedef long long ll;
using namespace std;

struct fenwick{
	int n;
	vector<int> fen;
	fenwick(int n) : n(n), fen(n){}

	void upd(int pos, int val){
		for(; pos < n; pos |= pos + 1)
			fen[pos] += val;
	}

	int index(int ind){
		int ret = 0;
		for(; ind >= 0; ind = (ind & (ind + 1)) - 1)
			ret += fen[ind];
		return ret;
	}
};

ll count_swaps(vector<int> v){
	int n = v.size() / 2;
	set<int> negative;
	set<int> positive;
	vector<vector<int>> posoccurence(n + 1), negoccurence(n + 1);

	for(int i = 2 * n - 1; i >= 0; i--){
		if(v[i] < 0) negative.insert(i);
		else posoccurence[v[i]].pb(i), positive.insert(i);
	}

	for(int i = 0; i < 2 * n; i++)
		if(v[i] < 0) negoccurence[-v[i]].pb(i);

	fenwick fen(2 * n);
	ll ans = 0;

	for(int i = 0; i < 2 * n; i++)
		fen.upd(i, 1);

	for(int i = 0; i < n; i++){
		if(fen.index(*negative.begin()) != 1 && fen.index(2 * n - 1) == fen.index(*prev(positive.end()))){
			int pos = *prev(positive.end());
			positive.erase(pos);
			int val = v[pos];
			fen.upd(pos, -1);
			pos = fen.index(pos);
			ans += fen.index(2 * n - 1) - pos;

			int neg = negoccurence[val].back(); negoccurence[val].pop_back();
			fen.upd(neg, -1);
			negative.erase(neg);
			neg = fen.index(neg);
			ans += fen.index(2 * n - 1) - neg;

		}
		else{
			int neg = *negative.begin(); negative.erase(negative.begin());
			int val = v[neg];
			fen.upd(neg, -1);
			neg = fen.index(neg);
			ans += neg;

			int pos = posoccurence[-val].back();
			posoccurence[-val].pop_back();
			fen.upd(pos, -1);
			positive.erase(pos);
			pos = fen.index(pos);
			ans += pos;
		}
	}
	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...