Submission #1229541

#TimeUsernameProblemLanguageResultExecution timeMemory
1229541dianaArranging Shoes (IOI19_shoes)C++17
30 / 100
95 ms37956 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define ll long long
using namespace std;

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

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

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

int 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];

    int 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;
        int pa = -s[i];
        int id = p[N+pa].back();
        p[N+pa].pop_back();
        ans += cnt(i+1, id-1);
        if(s[i] > 0)
            ans++;
        add(i, -1);
        add(id, -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...