제출 #545479

#제출 시각아이디문제언어결과실행 시간메모리
545479LunaMemeArranging Shoes (IOI19_shoes)C++14
100 / 100
348 ms149916 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> ii;
typedef vector<pair<int, int>> vii;
typedef vector<int> vi;
typedef long long ll;
#define PB push_back
#define MP make_pair
#define FOR(i, x, y) for (int i = x; i < y ; i ++)
const int MAXN  = 2e5 + 5;
ll tree[MAXN];
void update(int a, int u){
	a ++;
	for(int k = a; k < MAXN; k += (k & -k)){
		tree[k] += u;
	}
}
ll sum(int a){
	a ++;
	ll res = 0;
	for(int k = a; k >= 1; k -=(k &-k)){
		res += tree[k];
	}
	//cout << a << "  sum = " << res << '\n';
	return res;
}
long long count_swaps(std::vector<int> s) {
	memset(tree, 0, sizeof tree);
	unordered_map<int, deque<int>> pos;
	int sz = s.size();
	for(int i = sz - 1; i >= 0; i--){
		pos[s[i]].PB(i);
	}
	vector<bool> removed(sz, false);
	ll swaps = 0;
	vi d(2*sz, 0);//difference array for num of removed to right of it

	for(int i = sz - 1; i >= 0; i --){
		if (removed[i]) continue;
		int pair = pos[-s[i]].front();
		//cout << i << "  pair index : " << pair << '\n';
		pos[-s[i]].pop_front();
		pos[s[i]].pop_front();
		swaps += (i - pair - 1);
		swaps -= sum(pair) - sum(i); 
		//update d in range 0 to pair
		update(0, 1);
		update(pair, -1);
		if (s[i] < 0){
			swaps ++;
		}
		removed[pair] = true;
		//cout << swaps << '\n';
	}
	return swaps;
}

/*
int main() {
	int n;
	assert(1 == scanf("%d", &n));
	vector<int> S(2 * n);
	for (int i = 0; i < 2 * n; i++)
		assert(1 == scanf("%d", &S[i]));
	fclose(stdin);

	long long result = count_swaps(S);

	printf("%lld\n", result);
	fclose(stdout);
	return 0;
}
*/
#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...