Submission #1307470

#TimeUsernameProblemLanguageResultExecution timeMemory
1307470hectormedranoArranging Shoes (IOI19_shoes)C++20
0 / 100
4 ms6716 KiB
#include <cstdio>
#include <cassert>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<ll> st(8e5+5, 0);

void update(ll l, ll r, ll ind, ll pos){
    if(l == r){st[l]++; return;}
    ll m = (l+r)/2;
    if(pos<=m){
        update(l, m, 2*ind, pos);
    } else {
        update(m+1, r, 2*ind+1, pos);
    }
    st[ind] = st[2*ind] + st[2*ind+1];
}

ll query(ll l, ll r, ll ind, ll ql, ll qr){
    if(r<ql or qr<l){return 0;}
    if(ql<=l and r<=qr){return st[ind];}
    ll m = (l+r)/2;
    return query(l, m, 2*ind, ql, qr) + query(m+1, r, 2*ind+1, ql, qr);
}

ll count_swaps(vector<int> s) {
    ll n = s.size();
    n = n/2;
    vector<ll> a, p(n);
    vector<queue<ll>> q(4*n+1);
    for(ll x : s){
        if(x<0){
            a.push_back(x);
            a.push_back(-x);
        }
    }
    for(ll i=0;i<2*n;i++){
        q[2*n+a[i]].push(i);
    }
    for(ll i=0;i<2*n;i++){
        p[i] = q[s[i]+2*n].front();
        q[s[i]+2*n].pop();
    }
    ll inv = 0;
    for(ll i=0;i<2*n;i++){
        inv += query(0, 2*n-1, 1, p[i], 2*n-1);
        update(0, 2*n-1, 1, p[i]);
    }
	return inv;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...