Submission #1244107

#TimeUsernameProblemLanguageResultExecution timeMemory
1244107ollelapArranging Shoes (IOI19_shoes)C++20
45 / 100
54 ms13640 KiB
#include "shoes.h"

using namespace std;
#include <bits/stdc++.h>

#define rep(i,a,b) for(int i = a; i < b; i++)
typedef long long ll;


// SUM TREE
struct SegmTree {
vector<ll> T; int n;
SegmTree(int n) : T(2 * n, (ll)0), n(n) {}

    void Update(int pos, ll val) {
        for (T[pos += n] = val; pos > 1; pos /= 2)
        T[pos / 2] = T[pos] + T[pos ^ 1];
    }

    ll Query(int b, int e) {
        ll res = 0;
        for (b += n, e += n; b < e; b /= 2, e /= 2) {
            if (b % 2) res = res + T[b++];
            if (e % 2) res = res + T[--e];
        }
        return res;
    }
};


long long count_swaps(std::vector<int> arr) {
    int n = arr.size();

    vector<vector<int>> p2index(n);
    vector<int> pointer(n, 0);
    rep(i,0,n) if (arr[i] > 0) p2index[arr[i]].push_back(i);


    SegmTree tr(n);

    ll ans = 0;

    rep(i,0,n) {
        if (arr[i] > 0) continue;

        ll here = i - tr.Query(0, i);
        tr.Update(i, 1);
        int nei = p2index[-arr[i]][pointer[-arr[i]]];
        here += nei - tr.Query(0, nei);
        tr.Update(nei, 1);
        pointer[-arr[i]]++;

        ans += here;
    }

    return ans;
}

#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...