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>
#define MAXN 200005
using namespace std;
int x, a[MAXN], n;
inline int lowbit(int x)
{
return x & (-x);
}
void add(int x)
{
while (x <= n)
{
a[x]++;
x += lowbit(x);
}
return;
}
int pre(int x)
{
int ans = 0;
while (x > 0)
{
ans += a[x];
x -= lowbit(x);
}
return ans;
}
int query(int x, int y)
{
return pre(y) - pre(x - 1);
}
vector<vector<int> > rpos(MAXN), lpos(MAXN);
bool vis[MAXN];
long long count_swaps(std::vector<int> s)
{
n = s.size();
s.push_back(0);
for (int i = n; i >= 1; i--)
s[i] = s[i - 1];
for (int i = 1; i <= n; i++)
if (s[i] > 0)
rpos[s[i]].push_back(i);
else
lpos[-s[i]].push_back(i);
long long sum = 0;
int cnt = 0;
for (int i = 1; i <= n; i++)
{
if (vis[i])
continue;
if (s[i] < 0)
{
int ss = -s[i];
sum += i + query(i + 1, n) - 1 - cnt;
vis[i] = 1;
//cout<<sum<<" ";
add(i);
for (int j = 0; j < (int)rpos[ss].size(); j++)
{
int pos = rpos[ss][j];
if (vis[pos])
continue;
vis[pos] = 1;
//cout<<i<<" "<<pos<<endl;
sum += pos - (cnt + 2) + query(pos + 1, n);
add(pos);
//cout<<sum<<endl;
break;
}
cnt += 2;
}
else if (s[i] > 0)
{
int ss = s[i];
sum += (i - cnt - 1) + query(i + 1, n);
add(i);
vis[i] = 1;
for (int j = 0; j < (int)lpos[ss].size(); j++)
{
int pos = lpos[ss][j];
if (vis[pos])
continue;
vis[pos] = 1;
sum += pos - (cnt + 2) + query(pos + 1, n) + 1;
add(pos);
break;
}
cnt += 2;
}
}
return sum;
}
# | 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... |