Submission #1241590

#TimeUsernameProblemLanguageResultExecution timeMemory
1241590The_SamuraiArranging Shoes (IOI19_shoes)C++20
100 / 100
317 ms146796 KiB
#include "shoes.h"
#include "bits/stdc++.h"
using namespace std;
using ll = long long;

struct fenwick {
	vector<int> tree;
	int n;
	
	void init(int len) {
		n = len;
		tree.assign(n + 1, 0);
	}

	void upd(int i, int v) {
		for (i++; i <= n; i += i & (-i)) tree[i] += v;
	}

	int get(int i) {
		int sum = 0;
		for (i++; i > 0; i -= i & (-i)) sum += tree[i];
		return sum;
	}

	int get(int l, int r) {
		return get(r) - get(l - 1);
	}
};

long long count_swaps(std::vector<int> s) {
	map<int, queue<int>> mp;
	vector<int> vec;
	ll ans = 0;
	fenwick fw; fw.init(s.size());
	for (int i = 0; i < s.size(); i++) {
		if (!mp[-s[i]].empty()) {
			int j = mp[-s[i]].front(); mp[-s[i]].pop();
			ans += fw.get(j + 1, s.size() - 1);
			// cout << i << ' ' << j << ' ' << ans << endl;
			if (s[i] < 0) ans++;
			fw.upd(j, 1);
		} else {
			mp[s[i]].push(i);
			fw.upd(i, 1);
		}
	}
	// for (int x: vec) cout << x << ' ';
	// cout << endl;
	// for (int i = 1; i < vec.size(); i += 2) assert(vec[i] == -vec[i - 1]);
	// for (int i = 1; i < vec.size(); i += 2) assert(min(vec[i], vec[i - 1]) == vec[i - 1]);
	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...