제출 #1355904

#제출 시각아이디문제언어결과실행 시간메모리
1355904vjudge1Arranging Shoes (IOI19_shoes)C++17
100 / 100
40 ms17632 KiB
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;
#define ll long long
ll fw[200010];
int n;
set<int> posl[100010], posr[100010];

void add(int idx, ll x)
{
    for (int i = idx; i <= n; i+=(i&-i)){
        fw[i] += x;
    }
}

ll fi(int idx)
{
    ll res = 0;
    for (int i = idx; i >= 1; i-=(i&-i)){
        res += fw[i];
    }
    return res;
}

ll count_swaps(vector<int> S)
{
    n = S.size();
    ll ans = 0;
	for (int i = 1; i <= n; i++){
		add(i, 1);
	}
    for (int i = 1; i <= n; i++){
		int now = S[i-1];
        if (now < 0){
			if (!posr[-now].empty()){
				int idx = *(posr[-now].begin());
				posr[-now].erase(posr[-now].begin());
				int res = fi(idx);
				ans += i-res;
				add(idx,1);
				add(i,-1);
			}
			else {
				posl[-now].insert(i);
			}
        }
        else {
			if (!posl[now].empty()){
				int idx = *(posl[now].begin());
				posl[now].erase(posl[now].begin());
				int res = fi(idx);
				ans += i-res-1;
				add(idx,1);
				add(i,-1);
			}
			else {
				posr[now].insert(i);
			}
        }
    }
	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...