Submission #861424

#TimeUsernameProblemLanguageResultExecution timeMemory
861424UnforgettableplArranging Shoes (IOI19_shoes)C++17
100 / 100
407 ms30104 KiB
/*
ID: samikgo1
TASK: wormhole
LANG: C++
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
#define all(x) x.begin(),x.end()
#define allr(x) x.rbegin(),x.rend()
//#define f first
//#define s second
//#define x first
//#define y second
const int INF = 1e9;
const ll modulo = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update>

#define int ll

int arr[200001];

int64_t count_swaps(std::vector<int32_t> s) {
    int n = s.size();
    for(int i=1;i<=n;i++)arr[i]=s[i-1];
    set<pair<int,int>> pairLookup;
    ordered_set currActive;
    for(int i=1;i<=n;i++)pairLookup.emplace(arr[i],i);
    for(int i=1;i<=n;i++)currActive.insert(i);
    int ans = 0;
    for(int i=0;i<n/2;i++){
        auto curr_first = *currActive.find_by_order(0);
        currActive.erase(currActive.find_by_order(0));
        pairLookup.erase(make_pair(arr[curr_first],curr_first));
        if(arr[curr_first]>0)ans++;
        auto curr_second = pairLookup.lower_bound(make_pair(-arr[curr_first],0))->second;
        pairLookup.erase(make_pair(arr[curr_second],curr_second));
        ans+=currActive.order_of_key(curr_second);
        currActive.erase(curr_second);
    }
    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...