This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "shoes.h"
#include "bits/stdc++.h"
using namespace std;
const int tam = 200010;
int bit[tam];
void add(int pos, int val)
{
while(pos < tam)
bit[pos] += val, pos += pos & -pos;
}
int query(int pos)
{
int res = 0;
while(pos)
res += bit[pos], pos -= pos & -pos;
return res;
}
long long count_swaps(std::vector<int> s) {
int n = (int)s.size() / 2;
// cout<<n<<'\n';
vector<queue<int>> colasp(n + 1), colasn(n + 1);
vector<pair<int, int>> pares;
// cout<<s.size()<<'\n';
for(int i = 0; i < 2 * n; i++)
{
// cout<<i<<'\n';
add(i + 1, 1);
if(s[i] > 0)
{
if(colasn[s[i]].empty())
colasp[s[i]].push(i);
else
pares.push_back({colasn[s[i]].front(), i}), colasn[s[i]].pop();
}
else
{
if(colasp[-s[i]].empty())
colasn[-s[i]].push(i);
else
pares.push_back({colasp[-s[i]].front(), i}), colasp[-s[i]].pop();
}
}
long long res = 0;
sort(pares.begin(), pares.end());
// cout<<pares.size()<<'\n';
for(int i = 0; i < n; i++)
{
// cout<<i<<'\n';
int a = pares[i].first, b = pares[i].second;
res += query(b) - query(a + 1);
if(s[a] > 0)
res++;
add(b + 1, -1);
add(a + 1, 1);
}
return res;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |