이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "shoes.h"
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1e5;
int fen[2*N];
vector <int> pos[N];
vector <int> pos2[N];
int pt[N*2];
int n;
void add(int pos, int x){
for(int i = pos;i < n;i|=(i + 1)){
fen[i]+=x;
}
}
int get(int pos){
int r = 0;
for(int i = pos;i >= 0;i&=(i + 1),i--){
r+=fen[i];
}
return r;
}
long long count_swaps(std::vector<int> s){
n = s.size();
for(int i = 0;i < n;i++){
if(s[i] > 0){
pt[i] = (int)pos[s[i] - 1].size();
pos[s[i] - 1].push_back(i);
}else{
pt[i] = (int)pos2[-s[i] - 1].size();
pos2[-s[i] - 1].push_back(i);
}
add(i, 1);
}
ll ans = 0;
for(int i = 0;i < n;i++){
int id1 = pos[(s[i] > 0?s[i] - 1:-s[i] - 1)][pt[i]];
int id2 = pos2[(s[i] > 0?s[i] - 1:-s[i] - 1)][pt[i]];
//cout<<id1<<' '<<id2<<'\n';
if(id2 < id1)swap(id2,id1);
if(id2 == i)continue;
add(id1, -1);
add(id2, -1);
ans+=get(id2);
if(s[id1] > 0)ans++;
}
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... |