Submission #255726

#TimeUsernameProblemLanguageResultExecution timeMemory
255726jainbot27Arranging Shoes (IOI19_shoes)C++17
100 / 100
467 ms28408 KiB
#include <bits/stdc++.h> #include <shoes.h> using namespace std; using ll = long long; template<class T> struct Seg { const T sta = 0; T comb(T a, T b){ return a + b; } int n; vector<T> seg; void init(int nn){ n = nn; seg.assign(3*n, sta); } void pull(int q){ seg[q] = comb(seg[2*q], seg[2*q+1]); } void update(int q, T val){ seg[q+=n] += val; for(q/=2; q!=0;q/=2) pull(q); } T query(int l, int r){ T ri = sta, la = sta; for(l += n, r+= n+1; l < r; l/=2, r/=2){ if(l&1) ri = comb(ri, seg[l++]); if(r&1) la = comb(seg[--r], la); } return comb(ri, la); } }; ll count_swaps(vector<int> S){ int n = S.size()/2; // cerr << "N " << n << endl; Seg<int> seg; map<int, vector<int>> mp; vector<int> seen(2 * n, 0); for(int i=0; i < 2*n; i++){ mp[S[i]].push_back(i); } for(auto&z : mp){ sort(z.second.begin(), z.second.end(), greater<int>()); // cerr << z.first << " "; // for(auto& v : z.second){ // cerr << v << " " ; // } // cerr << endl; } ll ans = 0; seg.init(2 * n); for(int i = 0; i < 2 * n; i++){ if(!seen[i]){ int x = mp[-S[i]].back(); seen[x] = 1; seen[i] = 1; mp[-S[i]].pop_back(); mp[S[i]].pop_back(); int pos1 = i + seg.query(0, i); int pos2 = x + seg.query(0, x); if(((pos2 < pos1) && S[i] < 0) || (S[i] > 0 && pos1 < pos2)){ ans++; } // cerr << "POS1 " << i << " POS2 " << x << endl; ans += abs(pos2 - pos1 - 1); seg.update(i + 1, 1); seg.update(x, -1); } } return ans; } // int main(){ // vector<int> arr = {2, 1, -1, -2}; // cout << count_swaps(arr) << endl; // }
#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...