Submission #1026020

#TimeUsernameProblemLanguageResultExecution timeMemory
1026020vaneaArranging Shoes (IOI19_shoes)C++14
100 / 100
165 ms14932 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mxN = 2e6+10; bool vis[mxN]; int st[mxN]; int n; void upd(int idx, int x) { st[idx += n] = x; for(idx >>= 1; idx >= 1; idx >>= 1) st[idx] = st[idx*2] + st[idx*2+1]; } int query(int l, int r) { ++r; int ans = 0; for(l += n, r += n; l < r; l >>= 1, r >>= 1) { if(l & 1) ans += st[l++]; if(r & 1) ans += st[--r]; } return ans; } ll count_swaps(vector<int> v) { n = v.size(); ll ans = 0; multiset<array<int, 2>> m; for(int i = 0; i < n; i++) { m.insert({v[i], i}); } for(int i = 0; i < n; i++) { if(vis[i]) continue; auto it = m.lower_bound({-v[i], -1}); int idx = (*it)[1]; int mn = query(i+1, idx-1); vis[i] = vis[idx] = true; m.erase(it); m.erase({v[i], i}); if(v[i] > 0) { ans += (idx-i)-mn; } else { ans += (idx-i-1)-mn; } upd(i, 1); upd(idx, 1); } return ans; } /* int main() { ll ans = count_swaps({2, 1, -1, -2}); cout << 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...