제출 #1335628

#제출 시각아이디문제언어결과실행 시간메모리
1335628mattartaArranging Shoes (IOI19_shoes)C++20
100 / 100
325 ms32640 KiB
#include "shoes.h"
#include <bits/stdc++.h>

#ifdef DEBUG
    #define debug(...) println(clog, __VA_ARGS__)
#else
    #define debug(...)
#endif

#define forall(i, s, e) for(int i=(s); i<(e); i++)

#define sz(x) (int)(x).size()

using namespace std;

using ll = long long;

using vi = vector<int>;
using vl = vector<ll>;
using vb = vector<bool>;

using aii = array<int, 2>;
using all = array<ll, 2>;

const ll IDENTITY = 0;

struct segment {
    int N;
    vector<ll> T;

    segment() {};
    segment(int n){
        N = n;
        T.assign(2*N, IDENTITY);
    }

    void upd(int i, ll x){
        i += N;
        T[i] = x;
        for(; i>1; i/=2)
            T[i/2] = T[i] + T[i^1];
    }

    ll query(int l, int r){ // [l, r)
        ll res = 0;
        l += N, r += N;
        for (; l < r; l/=2, r/=2) {
            if(l%2) res += T[l++];
            if(r%2) res += T[--r];
        }
        return res;
    }

    ll query(int i){
        return T[i+N];
    }
};


ll count_swaps(vi s) {
    int N = s.size();
    map<int, vi> Mp;
    set<int> S;

    forall(i, 0, N) {
        S.insert(abs(s[i]));
        Mp[s[i]].push_back(i);
    }

    vector<aii> rng;

    ll ans = 0;

    for(int i:S) {
        vi &pos = Mp[i];
        vi &neg = Mp[-i];

        assert(pos.size() == neg.size());

        forall(j, 0, sz(pos)) {
            ans += abs(pos[j]-neg[j]) - 1 + (pos[j]<neg[j]);

            int l=pos[j], r=neg[j];
            if(l>r) swap(l,r);

            rng.push_back({l,r});
        }
    }

    sort(rng.begin(), rng.end());

    segment ST(N);

    for(auto [l,r]:rng) {
        ans -= ST.query(l, r+1);
        ST.upd(r, 1);
    }

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