Submission #978018

#TimeUsernameProblemLanguageResultExecution timeMemory
978018kilkuwuArranging Shoes (IOI19_shoes)C++17
100 / 100
443 ms36268 KiB
#include "shoes.h" #include <bits/stdc++.h> struct SegmentTree { int n; std::vector<int> t; SegmentTree(int _n) : n(_n), t(2 * n) {} void update(int l, int r, int v) { for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l & 1) t[l] += v, l++; if (r & 1) --r, t[r] += v; } } int query(int p) { int ans = 0; for (p += n; p > 0; p >>= 1) { ans += t[p]; } return ans; } }; long long count_swaps(std::vector<int> s) { int n = (int) s.size() / 2; SegmentTree tree(2 * n); for (int i = 0; i < 2 * n; i++) { tree.update(i, i + 1, i); } std::map<int, std::vector<int>> mp; std::set<std::pair<int, int>> st; for (int i = 2 * n; i >= 0; i--) { mp[s[i]].push_back(i); st.insert({i, s[i]}); } long long ans = 0; for (int i = 0; i < n; i++) { int f = 2 * i; int v = st.begin()->second; auto pos = mp[-v].back(); mp[-v].pop_back(); mp[v].pop_back(); int real_pos = tree.query(pos); ans += real_pos - (f + (v < 0)); tree.update(0, pos, 1); st.erase(st.begin()); st.erase({pos, s[pos]}); } 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...