/**
* بسم الله الرحمن الرحيم *
﴾ رَبِّ اشْرَحْ لِي صَدْرِي * وَيَسِّرْ لِي أَمْرِي * وَاحْلُلْ عُقْدَةً مِّن لِّسَانِي * يَفْقَهُوا قَوْلِي ﴿
*/
/// author : "ASGA"
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
long long count_swaps(vector<int>s);
struct ft{
vector<ll>f;
int n;
ft(int N){
n=N+1;
f.assign(n+1,0);
for(int i=1;i<=n;i++){
int j=i;
while(j<=n){
f[j]++;
j+=j&-j;
}
}
}
void edit(int i){
i++;
while(i<=n){
f[i]++;
i+=i&-i;
}
}
int get(int i){
ll ret=0;i++;
while(i){
ret+=f[i];
i-=i&-i;
}
return ret;
}
};
ll count_swaps(vector<int>a){
int n=a.size();
ll ans=0;
ft f(n);
vector<array<vector<int>,2>>pos(n/2+1);
for(int i=0;i<n;i++)pos[abs(a[i])][a[i]<0].push_back(i);
vector<array<int,2>>rng;
vector<int>vis(n,0);
for(int i=0;i<n;i++){
if(vis[i])continue;
int j=pos[abs(a[i])][a[i]>0].back();
pos[abs(a[i])][a[i]>0].pop_back();
vis[j]=1;
rng.push_back({j,i});
}
sort(rng.rbegin(),rng.rend());
for(auto&[j,i]:rng){
if(a[i]<0)ans+=f.get(j-1)-f.get(i);
else ans+=f.get(j)-f.get(i);
f.edit(j);
}
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... |