Submission #540495

#TimeUsernameProblemLanguageResultExecution timeMemory
540495beaconmcArranging Shoes (IOI19_shoes)C++14
100 / 100
388 ms149880 KiB
#include <bits/stdc++.h>
    
typedef long long ll;
#define FOR(i,x,y) for(ll i=x; i<y; i++)
using namespace std;

#define TREESIZE 1048576
#define HSIZE 524288

ll tree[TREESIZE];
void update(ll a, ll b){
    a += HSIZE;
    tree[a] = b;
    while (a>1){
        a/=2;
        tree[a] = tree[a*2] + tree[a*2+1];
    }
}

ll query(ll a, ll b){
    a += HSIZE;
    b += HSIZE;
    if (a>b) swap(a,b);
    ll sum = 0;
    while (a<=b){
        if (a%2==1){
            sum += tree[a++];
        }
        if (b%2==0){
            sum += tree[b--];
        }
        a/=2;
        b/=2;
    }
    return sum;
}

long long count_swaps(vector<int> s) {
    ll n = s.size();
    unordered_map<ll, queue<ll>> susmap;

    FOR(i,0,n){
        susmap[s[i]].push(i);
    }
    ll cur = 0;
    ll ans = 0;
    FOR(i,0,n){
        if (susmap[s[i]].size() == 0 || susmap[s[i]].front() != i){
            continue;
        }
        if (s[i] > 0){
            ans += abs(i - susmap[-1*s[i]].front());
            ans -= query(i, susmap[-1*s[i]].front());
        }else{
            ans += abs(i+1 - susmap[-1*s[i]].front());
            ans -= query(i+1, susmap[-1*s[i]].front());
        }
        update(susmap[s[i]].front(), 1);
        update(susmap[-1*s[i]].front(), 1);
        susmap[-1*s[i]].pop();
        susmap[s[i]].pop();
    }


    return ans;
}

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:45:8: warning: unused variable 'cur' [-Wunused-variable]
   45 |     ll cur = 0;
      |        ^~~
#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...