Submission #1358885

#TimeUsernameProblemLanguageResultExecution timeMemory
1358885thesenArranging Shoes (IOI19_shoes)C++20
100 / 100
61 ms22184 KiB
#include <bits/stdc++.h>
#define pb push_back
#define ll long long
#define vll vector<ll>
#define vbool vector<bool>
#define pairll pair<ll,ll>
#define fi first
#define sc second
#define rever greater<ll>()
using namespace std;

void add(vll &tree, ll x, ll v){
    if(x == 0)return;
    while(x < tree.size()){
        //cout << 'p';
        tree[x] += v;
        x += (x&(-x));
    }
}

ll query(vll &tree, ll l, ll r){
    ll res = 0;
    while(r > 0){
        //cout << "p";
        res += tree[r];
        r -= (r&(-r));
    }l--;
    while(l > 0){
        //cout << "p";
        res -= tree[l];
        l -= (l&(-l));
        //cout << l << ' ';
    }return res;
}

ll count_swaps(vector<int> a){
    ll n = a.size(); n/=2;

    vector<set<ll>> l(n+1), r(n+1);
    for(ll i = 0; i < n*2; i++){
        if(a[i] < 0){
            l[abs(a[i])].insert(i+1);
        }else{
            r[abs(a[i])].insert(i+1);
        }
    }

    vll tree(n*2+1);
    for(ll i = 1; i <= n*2; i++){
        add(tree, i, 1);
    }

    ll res = 0, x;
    vbool b(n*2);
    for(ll i = 0; i < n*2; i++){
        if(b[i])continue;
        if(a[i] < 0){
            x = *(r[abs(a[i])].upper_bound(i+1));
            res += query(tree, i+2, x-1);
            add(tree, x, -1);
            r[abs(a[i])].erase(x);
            b[x-1] = true;
        }else{
            x = *(l[abs(a[i])].upper_bound(i+1));
            //cout << x << endl;
            res += query(tree, i+1, x-1);
            add(tree, x, -1);
            l[abs(a[i])].erase(x);
            b[x-1] = true;
        }//cout << i << ' ' << res << endl;
    }return res;
}

// int main(){
//     cout << count_swaps({-2, 2, 2, -2, -2, 2});
// }
#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...