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 <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2*1e5+5, INF = 4e18+9;
struct SegmentTree{
vector<ll> T;
int n, N;
SegmentTree(int n) : n(n){
N = 1;
while(N < n) N*=2;
T.resize(N*2+1, 0);
};
void upd(int i, int x){
auto upd = [&](auto upd, int node, int low, int high, int i, int x) -> void{
if(low == high){
T[node] = x;
return;
}
int mid = (low+high)/2;
if(i <= mid){
upd(upd, node*2, low, mid, i, x);
}else{
upd(upd, node*2+1, mid+1, high, i, x);
}
T[node] = T[node*2]+T[node*2+1];
};
upd(upd, 1, 1, N, i, x);
}
int sum(int l, int r){
auto sum = [&](auto sum, int node, int low, int high, int l, int r) -> int{
if(low > r || l > high) return 0;
if(low >= l && r >= high) return T[node];
int mid = (low+high)/2;
return sum(sum, node*2, low, mid, l, r) + sum(sum, node*2+1, mid+1, high, l, r);
};
return sum(sum, 1, 1, N, l, r);
}
};
long long count_swaps(std::vector<int> s) {
int n = s.size();
vector<ll> a(n+1);
for(int i = 1; i <= n; i++){
a[i] = s[i-1];
}
vector<vector<int>> d(n+1), c(n+1);
for(int i = n; i >= 1; i--){
if(a[i] < 0){
c[a[i]*-1].push_back(i);
}else{
d[a[i]].push_back(i);
}
}
vector<bool> alive(n+1, 1);
ll ans = 0;
SegmentTree T(n+1);
for(int i = 1; i <= n; i++){
T.upd(i, 1);
}
for(int i = 1; i <= n; i++){
if(!alive[i]) continue;
if(a[i] < 0){
c[a[i]*-1].pop_back();
int j = d[a[i]*-1].back();
d[a[i]*-1].pop_back();
ans += T.sum(i+1, j)-1;
alive[i] = 0;
T.upd(i, 0);
alive[j] = 0;
T.upd(j, 0);
}else{
d[a[i]].pop_back();
int j = c[a[i]].back();
c[a[i]].pop_back();
ans += T.sum(i, j)-1;
alive[i] = 0;
T.upd(i, 0);
alive[j] = 0;
T.upd(j, 0);
}
}
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... |