Submission #724243

#TimeUsernameProblemLanguageResultExecution timeMemory
724243badontArranging Shoes (IOI19_shoes)C++17
100 / 100
75 ms17176 KiB
#include "shoes.h" #include <cmath> #include <cstdlib> #include <cassert> using ll = long long; using namespace std; template<typename T> struct fen { vector<T> tr; ll mxn; fen(ll sz) { mxn = sz; tr.assign(sz + 5, 0); } void upd(ll g, T k) { g++; for (; g <= mxn; g += g&-g) tr[g] += k; } T ge(ll g) { g++; T res = 0; for (; g; g -= g&-g) res += tr[g]; return res; } T rng(ll l, ll r) { if (l > r) return 0; return ge(r) - ge(l - 1); } }; long long count_swaps(std::vector<int> s) { ll n = (ll)s.size(); n /= 2; vector<vector<ll>> pos(n, vector<ll>()), neg(n, vector<ll>()); for (int i = 0; i < 2 * n; i++) { ll x = abs(s[i]); if (s[i] < 0) { neg[x - 1].push_back(i); } else { pos[x - 1].push_back(i); } } ll op_1 = 0, op_2 = 0; vector<ll> match(2 * n); for (int i = 0; i < n; i++) { assert(neg[i].size() == pos[i].size()); for (int j = 0; j < (int)neg[i].size(); j++) { ll x = neg[i][j], y = pos[i][j]; match[x] = y; match[y] = x; if (x > y) op_2++; } } fen<ll> tree(2 * n); for (int i = 0; i < 2 * n; i++) tree.upd(i, 1); for (int i = 0; i < 2 * n; i++) if (match[i] > i) { op_1 += tree.rng(i + 1, match[i]) - 1; tree.upd(match[i], -1); } return op_1 + op_2; }
#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...