#include <bits/stdc++.h>
using namespace std;
int const lmax=2e5+7;
vector<int> w;
queue <int> qplus[lmax/2],qminus[lmax/2];
long long int aib[lmax];
int n,v[lmax];
int query(int pos)
{
pos++;
long long int sum=0;
for(int i=pos;i>0;i-=(i&-i))
{
sum+=aib[i];
}
return sum;
}
void update(int pos,long long int val)
{
pos++;
for(int i=pos;i<=n;i+=(i&-i))
{
aib[i]+=val;
}
}
void debug()
{
for(int i=0;i<n;i++)cout<<v[i]<<" ";
cout<<"\n";
}
long long int count_swaps(vector<int> vv)
{
long long int ans=0;
n=vv.size();
for(int i=0;i<n;i++)v[i]=vv[i];
for(int i=0;i<n;i++)update(i,1);
//debug();
for(int i=0;i<n;i++)
{
if(v[i]>0)qplus[v[i]].push(i);
else qminus[-v[i]].push(i);
}
///the mappings
int lastb=-1;
for(int i=0;i<n;i++)
{
if((query(i)-query(i-1))==0 or qplus[abs(v[i])].empty()==true or lastb==i)continue;
int a,b;
if(v[i]>0)
{
a=qplus[v[i]].front();///i
b=qminus[v[i]].front();
qplus[v[i]].pop();
qminus[v[i]].pop();
}
else
{
a=qminus[-v[i]].front();///i
b=qplus[-v[i]].front();
qplus[-v[i]].pop();
qminus[-v[i]].pop();
}
//cout<<a<<" "<<b<<"\n";
///i in vector -> i+1 in aib
///a=i, b=i+h, b>a
ans+=(query(b-1)-query(a));
if(v[i]>0)ans++;
update(b,-1);
update(a,-1);///does not help at least i dont think
lastb=b;
}
return ans;
}
| # | 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... |