Submission #1358337

#TimeUsernameProblemLanguageResultExecution timeMemory
1358337Ekber_EkberArranging Shoes (IOI19_shoes)C++20
0 / 100
0 ms344 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;

struct BIT{
    int n;
    vector <int> t;
    void init(int n1) {
        n = n1;
        t.assign(n+2, 0);
    }
    int get(int r) {
        int res=0;
        while (r > 0) {
            res += t[r];
            r -= (r & (-r));
        }
        return res;
    }
    void upd(int i, int x) {
        ++i;
        while (i <= n) {
            t[i] += x;
            i += (i & (-i));
        }
    }
    int get(int l, int r) {
        ++l, ++r;
        if (l == 1) return get(r);
        return get(r) - get(l-1);
    }
};

int get(vector <int> &a, vector <int> &b) {     // a -> b
    int n = a.size();
    int mn = *min_element(all(a));
    for (int i = 0; i < n; i++) {
        a[i] -= mn;
        b[i] -= mn;
    }
    // for (int &i : a) cerr << i << ' '; cerr << endl;
    // for (int &i : b) cerr << i << ' '; cerr << endl;
    int mx = *max_element(all(a));
    BIT t;
    t.init(n);
    vector <int> pos[mx + 1];
    for (int i = 0; i < n; i++) {
        pos[a[i]].pb(i);
    }
    for (int i = 0; i <= mx; i++) reverse(all(pos[i]));
    for (int i = 0; i < n; i++) t.upd(i, 1);
    int res = 0;
    for (int i = 0; i < n; i++) {
        int id = pos[b[i]].back();
        id = t.get(0, id);
        pos[b[i]].pop_back();
        if (id > i) res += t.get(i, id-1);
        t.upd(id, -1);
    }
    return res;
}

long long count_swaps(vector<int> v) {
	int n = v.size();
    vector <int> s;
    vector <int> l[n+1], r[n+1];
    for (int i = 0; i < n; i++) {
        if (v[i] < 0) l[-v[i]].pb(i);
        else r[v[i]].pb(i);
    }
    vector <int> pos(n, -1);
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < l[i].size(); j++) {
            pos[l[i][j]] = r[i][j];
            pos[r[i][j]] = l[i][j];
        }
    }
    vector <int> is(n, 0);
    for (int i = 0; i < n; i++) {
        if (!is[i]) {
            int x = i, y = pos[i];
            if (v[x] > 0) swap(x, y);
            s.pb(v[x]);
            s.pb(v[y]);
            is[x] = is[y] = 1;
        }
    }
	return get(v, s);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...