This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "shoes.h"
#include<bits/stdc++.h>
#define ll long long
const int mxn = 2e5+ 5;
using namespace std;
struct BIT {
int bit[mxn] = {};
void update(int p,int v) {
for(; p < mxn; p += p & -p) bit[p] += v;
}
int query(int p) {
int res = 0;
for(; p > 0; p -= p & -p) res += bit[p];
return res;
}
int query(int a,int b) {
if(a > b) return 0;
return query(b) - query(a - 1);
}
} bt;
ll count_swaps(vector<int> s) {
int n = s.size();
vector<int> left[n],right[n];
for(int i = n - 1; i >= 0; i--) {
if(s[i] < 0) left[-s[i]].push_back(i);
else right[s[i]].push_back(i);
}
int vis[n + 1] = {};
ll res = 0;
for(int i = 0; i < n; i++) {
if(vis[i]) {
continue;
}
if(s[i] < 0) {
int x = -s[i];
assert(i == left[x].back());
left[x].pop_back();
int y = right[x].back();
res += y - i - 1 - bt.query(i + 1,y - 1);
vis[y] = 1;
right[x].pop_back();
bt.update(y,1);
} else {
int x = s[i];
assert(i == right[x].back());
right[x].pop_back();
int y = left[x].back();
res += y - i - bt.query(i + 1,y - 1);
vis[y] = 1;
left[x].pop_back();
bt.update(y,1);
}
}
return res;
}
# | 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... |