이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;
typedef long long ll;
int n;
int arr[200002];
int match[200002];
queue<int> matchIdx[200002];
bool chk[200002];
struct fenwick{
int size;
ll tree[1000002];
fenwick(){}
void reset(int x){
size = x;
fill(tree, tree+x+1, 0LL);
}
ll getSum(int i){
ll ans = 0;
while(i>0){
ans += tree[i];
i -= (i&-i);
}
return ans;
}
ll getSum(int l, int r){
return getSum(r) - getSum(l-1);
}
void update(int i, ll val){
while(i<=size){
tree[i] += val;
i += (i&-i);
}
}
} tree;
ll count_swaps(vector<int> _arr) {
ll ans=0;
n = (int)_arr.size();
for(int i=1; i<=n; i++) arr[i] = _arr[i-1];
tree.reset(n);
for(int i=1; i<=n; i++){
tree.update(i, 1);
if(matchIdx[abs(arr[i])].empty()) matchIdx[abs(arr[i])].push(i);
else{
int tmp = matchIdx[abs(arr[i])].front();
if(arr[tmp] != arr[i]){
match[tmp] = i;
match[i] = tmp;
matchIdx[abs(arr[i])].pop();
}
else{
matchIdx[abs(arr[i])].push(i);
}
}
}
for(int i=1; i<=n; i++){
if(chk[match[i]]) continue;
chk[i] = 1;
int tmp = match[i];
ans += tree.getSum(i, tmp) - 2;
if(arr[i] > 0) ans++;
tree.update(i, -1);
tree.update(tmp, -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... |