제출 #1210959

#제출 시각아이디문제언어결과실행 시간메모리
1210959madamadam3Arranging Shoes (IOI19_shoes)C++20
100 / 100
449 ms30944 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int n;

struct Fenw {
	int n; vector<int> bit;

	Fenw(int N) {
		n = N;
		bit.assign(n, 0);
	}

	int g(int i) {
		return i & (i+1);
	}

	int h(int j) {
		return j | (j+1);
	}

	int query(int idx) {
		int res = 0;

		while (idx >= 0) {
			res += bit[idx];
			idx = g(idx) - 1;
		}

		return res;
	}

	void update(int idx, int delta) {
		while (idx < n) {
			bit[idx] += delta;
			idx = h(idx);
		}
	}

	void update(int l, int r, int delta) {
		update(l, delta);
		update(r+1, -delta);
	}
};

ll count_swaps(vector<int> s) {
	n = s.size() / 2;
	ll minimum = 0;

	auto fenw = Fenw(2*n);
	map<int, set<int>> shoes;
	set<int> used;

	for (int i = 0; i < 2*n; i++) {
		shoes[s[i]].insert(i);
	}

	for (int i = 0; i < 2*n; i++) {
		if (used.count(i)) continue;

		int size = s[i];
		int partner = *shoes[-size].begin();

		used.insert(i); used.insert(partner);
		shoes[size].erase(i); shoes[-size].erase(partner);

		int dist = (fenw.query(partner) + partner) - (fenw.query(i) + i) - 1;
		if (size > 0) dist++;
		minimum += dist;

		fenw.update(i, partner, 1);
	}

	return minimum;
}
#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...