제출 #1290306

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

vector<int> b(200005, 0);
void upd(int ind, int val) {
	for (; ind <= 200005; ind += ind & -ind) {
		b[ind] += val;
	}
}
int qa(int ind) {
	int res = 0;
	for (; ind > 0; ind -= ind & -ind) {
		res += b[ind];
	}
	return res;
}

long long count_swaps(vector<int> s) {
	int n = s.size() / 2;
	priority_queue<int, vector<int>, greater<int>> l[n + 3], r[n + 3];
	for (int i = 0; i < 2 * n; i++) {
		//cout << "LL";
		if (s[i] < 0) l[abs(s[i])].push(i);
		else r[s[i]].push(i);
	}
	long long ct = 0;
	vector<int> vis(2 * n + 1, 1);
	for (int i = 0; i < 2 * n; i++) {
		if (!vis[i]) continue;
		if (s[i] > 0) {
			int u = s[i];
			r[u].pop();
			//cout << "1 " << i << ' ' << l[u].top() << ' ' << l[u].top() - i << '\n';
			ct += l[u].top() - i - qa(l[u].top()) + qa(i); 
			vis[l[u].top()] = 0;
			upd(l[u].top(), 1);
			l[u].pop();
		} 
		else {
			int u = abs(s[i]);
			l[u].pop();
			//cout << "2 " << i << ' ' << r[u].top() << ' ' << r[u].top() - i - 1 << '\n';
			ct += r[u].top() - i - 1 - qa(r[u].top()) + qa(i);
			upd(r[u].top(), 1);
			vis[r[u].top()] = 0;
			r[u].pop();
		}
	}
	return ct;
}
#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...