제출 #1343081

#제출 시각아이디문제언어결과실행 시간메모리
1343081kantaponzArranging Shoes (IOI19_shoes)C++20
100 / 100
49 ms15276 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int nx = 1e5 + 5;

int n, a[nx*2], ptr[2*nx], tree[2*nx];
vector<int> pos[nx*2];
bool del[nx*2];

int h(int idx) {
	return idx + n + 1;
}


void update(int idx, int val) {
	for (int i = idx; i < 2*nx; i += (i & -i)) {
		tree[i] += val;
	}
}

ll query(int idx) {
	ll sum = 0;
	for (int i = idx; i >= 1; i-=(i&-i)) {
		sum += tree[i];
	}
	return sum;
}

long long count_swaps(vector<int> s) {
	n = s.size() / 2;
	for (int i = 1; i <= s.size(); i++) {
		a[i] = s[i - 1];
		update(i, 1);
		pos[h(a[i])].emplace_back(i);
		//cout << h(a[i]) << " ";
	}

	ll ans = 0;
	for (int i = 1; i <= s.size(); i++) {
		if (del[i]) continue;
		int p1 = pos[h(a[i])][ptr[h(a[i])]];
		//cout << p1 << " ";
		ptr[h(a[i])]++;
		int p2 = pos[h(-a[i])][ptr[h(-a[i])]];
		//cout << p2 << " ";
		ptr[h(-a[i])]++;
		del[p1] = del[p2] = 1;
		ll dist = (query(p2)-query(p1));
		//cout << dist << " ";
		update(p2, -1); update(p1, -1);
		ans += dist;
		if (a[i] < 0) ans--;
		//cout << endl;
	}
	return ans;
}

/*
g++ grader.cpp shoes.cpp -o o

3
-3 2 1 -2 3 -1

*/
#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...