Submission #1016281

#TimeUsernameProblemLanguageResultExecution timeMemory
1016281igofanArranging Shoes (IOI19_shoes)C++17
100 / 100
74 ms71784 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

struct Fen { //0 based index
	int n;
	vector<int> bit;
	Fen(int _n) : n(_n) {
		bit = vector<int>(n+1);
	}
	void add(int i, int val) {
		for(++i; i<=n; i+=i&-i) bit[i]+=val;
	}
	int sum(int i) { //[0, i]
		int ans = 0;
		for(++i; i>0; i-=i&-i) ans += bit[i];
		return ans;
	}
};

long long count_swaps(std::vector<int> s) {
	int n = s.size()/2;
	Fen fen(2*n+1);
	vector<queue<int>> v(n+1);
	long long ans = 0;
	for(int i=1; i<=2*n; i++) {
		int x = s[i-1];
		int a = abs(x);
		int sign = x / a;
		if (v[a].empty()) {
			v[a].push(i*sign); //i for right, -i for left
			fen.add(i, 1);
		} else {
			int j = v[a].front();
			if ((j<0 && x<0) || (j>0 && x>0)) {
				v[a].push(i*sign);
				fen.add(i, 1);
			} else {
				ans += (fen.sum(i) - fen.sum(abs(j)));
				if (j>0) ans++;
				fen.add(abs(j), 1);
				v[a].pop();
			}
		}
	}
	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...