Submission #876369

#TimeUsernameProblemLanguageResultExecution timeMemory
876369TahirAliyevArranging Shoes (IOI19_shoes)C++17
100 / 100
187 ms13644 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;
#define ll long long
#define pii pair<int, int>
#define oo 1e9

const int MAX = 2e5 + 5;
int tree[MAX];

void update(int pos, int val){
    for(int i = pos; i <= MAX; i += (i) & (-i)){
        tree[i] += val;
    }
}

int ask(int l, int r){
    if(l != 1) return ask(1 , r) - ask(1 , l - 1);
    int res = 0;
    for(int i = r; i > 0; i -= (i) & (-i)){
        res += tree[i];
    }
    return res;
}

bool V[MAX];
int nxt[MAX];

long long count_swaps(vector<int> s) {
    int n = s.size();
    set<pii> st;
    for(int i = 0; i < n; i++){
        st.insert({s[i], i});
        update(i + 1, 1);
    }
    ll ans = 0;
    for(int i = 0; i < n; i++){
        if(st.find({s[i], i}) == st.end()) continue;
        int j = (*st.lower_bound({-s[i], i})).second;
        if(i + 2 <= j){
            ans += ask(i + 2, j);
        }
        if(s[i] > 0){
            ans++;
        }
        update(i + 1, -1);
        update(j + 1, -1);
        st.erase({s[i], i});
        st.erase({-s[i], j});
    }
    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...