Submission #1356012

#TimeUsernameProblemLanguageResultExecution timeMemory
1356012po_rag526Arranging Shoes (IOI19_shoes)C++20
100 / 100
112 ms139860 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
queue<ll> pos1[100005],pos2[100005];
ll fen[200005];
void upd(ll idx,ll c) {
	for(int i = idx ; i<=200000 ; i+=(i&-i)) fen[i] += c;
}
ll query(int idx) {
	ll ret = 0;
	for(int i = idx ; i>0 ; i-=(i&-i)) ret += fen[i];
	return ret;
}
long long count_swaps(vector<int> s) {
	int n = s.size()/2;
	for(int i = 0 ; i<2*n; ++i) {
		if(s[i]>0) pos1[s[i]].push(i);
		else pos2[-s[i]].push(i);
		upd(i+1,1);
	}
	vector<bool> mark(2*n,0);
	ll ans = 0;
	for(int i = 0 ; i<2*n; ++i) {
		if(mark[i]) continue;
		int i2;
		if(s[i] > 0) i2 = pos2[s[i]].front();
		else i2 = pos1[-s[i]].front();
		pos1[abs(s[i])].pop(),pos2[abs(s[i])].pop();

		ll cnt = query(i2)-query(i+1);
		if(s[i] > 0) ans += cnt+1;
		else ans += cnt;
		//cout << i << " " << i2;
		upd(i+1,-1),upd(i2+1,-1);
		mark[i] = mark[i2] = 1;
	}
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...