#include "shoes.h"
int n,r,pos;
long long ans;
std::vector<int>locl[500001],locr[500001],s;
int fix[500001];
int indl[500001],indr[500001];
int tree[500001];
void upd(int node,int tl,int tr,int pos){
if(tl==tr){
tree[node] = 1;
return;
}
int mid = (tl+tr)/2;
if(pos<=mid)
upd(node*2,tl,mid,pos);
else
upd(node*2+1,mid+1,tr,pos);
tree[node] = tree[node*2] + tree[node*2+1];
}
int get(int node,int tl,int tr){
if(r<tl)return 0;
if(tr<=r)return tree[node];
int mid = (tr+tl)/2;
int x = get(node*2,tl,mid);
int y = get(node*2+1,mid+1,tr);
return x+y;
}
long long count_swaps(std::vector<int> s) {
for(int i=0;i<n;i++){
if(s[i]<0){
locl[-s[i]].push_back(i);
} else {
locr[s[i]].push_back(i);
}
}
for(int i=0;i<n;i++)
if(!fix[i]){
if(s[i]<0){
int loc = locr[ -s[i] ][ indr[ -s[i] ] ];
r = loc;
ans += loc - i - 1 - get(1,0,n-1);
indr[ -s[i] ] ++;
indl[ -s[i] ] ++;
fix[loc]=1;
upd(1,0,n-1,loc);
} else {
int loc = locl[ s[i] ][ indl[ s[i] ] ];
//cout<<loc<<endl;
r = loc;
ans += loc - i - get(1,0,n-1);
//cout<<ans<<endl;
indl[ s[i] ] ++;
indr[ s[i] ] ++;
fix[loc]=1;
upd(1,0,n-1,loc);
}
}
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
23800 KB |
Output is correct |
2 |
Incorrect |
23 ms |
23800 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
23800 KB |
Output is correct |
2 |
Incorrect |
23 ms |
23800 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
23800 KB |
Output is correct |
2 |
Incorrect |
23 ms |
23800 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
23804 KB |
Output is correct |
2 |
Incorrect |
23 ms |
23772 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
23800 KB |
Output is correct |
2 |
Incorrect |
23 ms |
23800 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
23800 KB |
Output is correct |
2 |
Incorrect |
23 ms |
23800 KB |
Output isn't correct |