Submission #1225422

#TimeUsernameProblemLanguageResultExecution timeMemory
1225422Hamed_GhaffariArranging Shoes (IOI19_shoes)C++20
100 / 100
49 ms14096 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MXN = 1e5+5;

int n, val[MXN];
int fen[MXN<<1];
vector<int> vec[MXN][2];

inline void upd(int p) {
    for(; p<=2*n; p+=p&-p) fen[p]++;
}
inline int get(int p) {
    int res=0;
    for(; p; p-=p&-p) res += fen[p];
    return res;
}

ll count_swaps(vector<int> S) {
    n = S.size();
    n >>= 1;
    for(int i=0; i<(n<<1); i++)
        vec[abs(S[i])][S[i]<0].push_back(i);
    int ptr=0;
    for(int x=1; x<=n; x++) {
        for(int i=0; i<vec[x][0].size(); i++) {
            S[vec[x][0][i]] = ++ptr;
            S[vec[x][1][i]] = -ptr;
        }
    }
    ptr = 0;
    ll ans = 0;
    for(int i=0; i<(n<<1); i++) {
        if(!val[abs(S[i])]) val[abs(S[i])] = ++ptr;
            ans += get(2*n+1 - 2*val[abs(S[i])]+(S[i]<0));
            upd(2*n+1 - 2*val[abs(S[i])]+(S[i]<0));
    }
    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...