이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
int fw[200200], mark[200200];
vector<int> L[100100], R[100100];
void update(int pos, int sz, int val)
{
while(pos <= sz)
{
fw[pos] += val;
pos += -pos&pos;
}
}
int query(int pos)
{
int sum = 0;
while(pos)
{
sum += fw[pos];
pos -= -pos&pos;
}
return sum;
}
long long count_swaps(vector<int> arr)
{
int n = arr.size();
for(int i=0 ; i<n ; i++)
{
if(arr[i] < 0) L[abs(arr[i])].pb(i+1);
else R[abs(arr[i])].pb(i+1);
update(i+1, n, 1);
}
long long ans = 0;
for(int i=0 ; i<n ; i++)
{
if(mark[i]) continue ;
int d = abs(arr[i]);
if(arr[i] < 0)
{
int l = 0, r = R[d].size() - 1;
while(l!=r)
{
int mid = (l+r)>>1;
if(R[d][mid] > i) r = mid;
else l = mid+1;
}
ans += query(R[d][l]) - 2;
update(i+1, n, -1);
update(R[d][l], n, -1);
mark[i] = mark[R[d][l]-1] = 1;
}
else
{
int l = 0, r = L[d].size()-1;
while(l!=r)
{
int mid = (l+r)>>1;
if(L[d][mid] > i) r = mid;
else l = mid+1;
}
ans += query(L[d][l]) - 1;
update(i+1, n, -1);
update(L[d][l], n, -1);
mark[i] = mark[L[d][l]-1] = 1;
}
}
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... |