Submission #572531

#TimeUsernameProblemLanguageResultExecution timeMemory
572531MadokaMagicaFanArranging Shoes (IOI19_shoes)C++14
50 / 100
1087 ms3040 KiB
#include "bits/stdc++.h"

using namespace std;

using ll = long long;
const ll inf = 1e9;
const int md1 = 1e9+7;
const int md2 = 998244353;

#define all(v)                      v.begin(), v.end()
#define rall(v)                     v.rbegin(), v.rend()
#define sz(v)                       ((int)v.size())

#define forn(i,n)                   for(int i = 0; i < n; ++i)
#define forbe(i,b,e)                for(int i = b; i < e; ++i)

#define pb                          push_back

#define pry                         puts("YES")
#define prn                         puts("NO")
#define endl                        '\n'

#define fst                         first
#define scn                         second

const int N = 1e5;

bitset<N+2> c;

int pnt[N+1];

template<typename T>
struct BIT{
    int n;
    vector<T> fen;
    BIT(int n){
        this->n = n;
        fen.assign(n,0);
    }
    BIT(vector<T> a) : BIT(a.size()){
        for(int i = 0; i < n; ++i) add(i,a[i]);
    }
    void add(int x, T v){
        for(; x < n; x |= x+1) fen[x] += v;
    }
    T query(int x){
        T res = 0;
        for(; x >= 0; x = (x&(x+1))-1)
            res += fen[x];
        return res;
    }
    T query(int l, int r){
        return query(r) - query(l-1);
    }
};

ll
count_swaps(vector<int> s)
{
    ll ans = 0;
    bitset<N> haspair;

    int size;
    BIT<int> deltr(sz(s)+5);

    for (int i = 0; i < sz(s); ++i) {
        if (c[i]) continue;
        size = abs(s[i]);
        pnt[size] = max(i,pnt[size]);
        ++pnt[size];
        while (s[pnt[size]] == s[i] || abs(s[pnt[size]]) != size)
            ++pnt[size];
        ans += pnt[size] - deltr.query(i,pnt[size]) -i;
        deltr.add(pnt[size],1);
        c[pnt[size]] = 1;
        if (s[i] < 0)
            --ans;
    }

    return ans;
}

#ifdef ONPC
void
solve()
{
    int n;
    cin >> n;
    vector<int> s(n);
    for (int i = 0; i < n; ++i)
        cin >> s[i];
    
    cout <<count_swaps(s) << endl;
}

int32_t
main()
{
    freopen("in", "r", stdin);
    int t = 1;
    /* cin >> t; */
    while(t--)
        solve();
}
#endif
#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...