Submission #304727

#TimeUsernameProblemLanguageResultExecution timeMemory
304727kjain_1810Arranging Shoes (IOI19_shoes)C++17
100 / 100
273 ms141444 KiB
#include "shoes.h"
#include<bits/stdc++.h>

typedef long long ll;
using namespace std;

const int N = 1e5 + 5;

int n;
ll segt[8 * N];
queue<int>vec[2 * N];

inline int lt(int x){return 2 * x;}
inline int rt(int x){return 2 * x + 1;}

void upd(int nd, int s, int e, int idx) {
	if(s > idx || e < idx)
		return;
	if(s == e) {
		segt[nd] += 1;
		return;
	}
	int m = (s + e) / 2;
	upd(lt(nd), s, m, idx);
	upd(rt(nd), m + 1, e, idx);
	segt[nd] = segt[lt(nd)] + segt[rt(nd)];
}

ll query(int nd, int s, int e, int l, int r) {
	if(s > r || e < l)
		return 0;
	if(s >= l && e <= r)
		return segt[nd];
	int m = (s + e) / 2;
	return query(lt(nd), s, m, l, r) + query(rt(nd), m + 1, e, l, r);
}

long long count_swaps(vector<int> s) {
	ll ans = 0;
	n = s.size();
	for(int a = 0; a < n; a++){
		s[a] += n / 2;
		vec[s[a]].push(a);
	}
	for(int a = 0; a < n; a++) {
		if(query(1, 1, n, a, a) == 1)
			continue;
		int target;
		if(s[a] > n)
			target = (-(s[a] - n / 2) + n / 2);
		else
			target = (-(s[a] - n / 2) + n / 2);
		int idx = vec[target].front();
		vec[target].pop();
		vec[s[a]].pop();
		ll toadd;
		if(s[a] < target)
			toadd = (idx - a - 1 - query(1, 1, n, a, idx));
		else
			toadd = (idx - a - query(1, 1, n, a, idx));
		ans += toadd;
		// printf("%d %d %d %d %lld\n", a, s[a], target, idx, toadd);
		upd(1, 1, n, idx);
	}
	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...