Submission #1229547

#TimeUsernameProblemLanguageResultExecution timeMemory
1229547dianaArranging Shoes (IOI19_shoes)C++17
50 / 100
94 ms39492 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 4e5+5;
ll st[N], n=0;

void add(int i, ll x, int l=0, int r=n, int cur=1)
{
    st[cur] += x;
    if(l == r)
        return;

    ll mid = (l+r)/2;
    if(i <= mid)
        add(i, x, l, mid, 2*cur);
    else
        add(i, x, mid+1, r, 2*cur+1);
}

ll cnt(int lg, int rg, int l=0, int r=n, int cur=1)
{
    if(rg < lg)
        return 0;
    if(rg < l || r < lg)
        return 0;
    if(lg <= l && r <= rg)
        return st[cur];

    ll mid = (l+r)/2;
    return cnt(lg, rg, l, mid, 2*cur) + cnt(lg, rg, mid+1, r, 2*cur+1);
}
vector<int> p[3*N];

ll count_swaps(vector<int> s)
{
    n = s.size();
    for(int i=n-1; i>=0; i--)
        p[N+s[i]].push_back(i);

    for(int i=0; i<n; i++)
        add(i, 1);

    ll ans = 0;

    for(int i=0; i<n; i++)
    {
        if(cnt(i, i) == 0)
            continue;
        ll pa = -s[i];
        ll id = p[N+pa].back();
        p[N+pa].pop_back();
        p[N-pa].pop_back();
        add(i, -1);
        add(id, -1);
        ans += cnt(i, id);
        if(s[i] > 0)
            ans++;
    }

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