제출 #788124

#제출 시각아이디문제언어결과실행 시간메모리
788124aykhnArranging Shoes (IOI19_shoes)C++14
100 / 100
114 ms33372 KiB
#include <bits/stdc++.h>
#include "shoes.h"

// author: aykhn

using namespace std;

typedef long long ll;

#define TC int t; cin >> t; while (t--) _();
#define OPT ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define all(v) v.begin(), v.end()
#define pii pair<int, int>
#define mpr make_pair
#define eb emplace_back
#define new int32_t
#define pb push_back
#define ts to_string
#define fi first
#define se second
#define ins insert
#define inf 0x3F3F3F3F
#define infll 0x3F3F3F3F3F3F3F3FLL
#define bpc __builtin_popcount

int n, sz = 1;
vector<int> st;

void add(int lx, int rx, int l, int r, int x)
{
    if (l >= rx || r <= lx) return;
    if (l >= lx && r <= rx)
    {
        st[x]++;
        return;
    }
    int mid = (l + r) >> 1;
    add(lx, rx, l, mid, 2*x+1);
    add(lx, rx, mid, r, 2*x+2);
}

int get(int ind, int l, int r, int x)
{
    if (l + 1 == r) return st[x];
    int mid = (l + r) >> 1;
    if (ind < mid) return st[x] + get(ind, l, mid, 2*x+1);
    else return st[x] + get(ind, mid, r, 2*x+2);
}

long long count_swaps(vector<int> v)
{
    n = v.size();
    while (sz < n) sz <<= 1;
    st.assign(sz << 1, 0);

    set<int> idx[2][n];

    for (int i = 0; i < n; i++)
    {
        idx[v[i] > 0][abs(v[i])].ins(i);
    }


    ll ans = 0;

    for (int i1 = 0; i1 < n; i1++)
    {
        int x = v[i1];
        if (idx[x > 0][abs(x)].empty() || i1 != *idx[x > 0][abs(x)].begin()) continue;
        idx[x > 0][abs(x)].erase(idx[x > 0][abs(x)].begin());
        int i = i1 + get(i1, 0, sz, 0);
        int id = *idx[x < 0][abs(x)].begin();
        idx[x < 0][abs(x)].erase(idx[x < 0][abs(x)].begin());
        int rid = id + get(id, 0, sz, 0);
        ans += rid - i - 1;
        if (x > 0) ans++;

        add(i1, id + 1, 0, sz, 0);
    }

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