Submission #298321

#TimeUsernameProblemLanguageResultExecution timeMemory
298321emil_physmathArranging Shoes (IOI19_shoes)C++17
10 / 100
1087 ms20632 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; using llong = long long; #define BUGO(x) cerr << #x << " = " << x << '\n'; const int maxN = 200'005; int t[maxN * 4]; int Get(int v, int vl, int vr, int i) { if (vl == vr) return t[v]; int vm = vl + (vr - vl) / 2; if (i <= vm) return t[v] + Get(v * 2, vl, vm, i); return t[v] + Get(v * 2 + 1, vm + 1, vr, i); } void Add(int v, int vl, int vr, int l, int r, int val) { if (l > vr || vl > r) return; if (l <= vl && vr <= r) { t[v] += val; return; } int vm = vl + (vr - vl) / 2; Add(v * 2, vl, vm, l, r, val); Add(v * 2 + 1, vm + 1, vr, l, r, val); } vector<int> pos_[maxN * 2]; vector<int>* pos = pos_ + maxN; long long count_swaps(vector<int> a) { auto A = [&a](int i) { int l = 0, r = a.size() - 1; int ans = -1; while (l <= r) { cerr << i << ": (" << l << ", " << r << ")\n"; int m = (l + r) / 2; int cur = Get(1, 0, a.size() - 1, m); if (cur >= i) { ans = m; r = m - 1; } else l = m + 1; } if (ans == -1) { cerr << i << '\n'; throw; } return ans; }; int n = a.size(); for (int i = 1; i < n; ++i) Add(1, 0, n - 1, i, i, i); for (int i = 0; i < n; ++i) pos[a[i]].push_back(i); for (int i = -n; i <= n; ++i) reverse(pos[i].begin(), pos[i].end()); llong ans = 0; for (int i = 0; i < n; i += 2) { int ai = a[A(i)], ai1 = a[A(i + 1)]; if (abs(ai) == abs(ai1) && ai < 0 && ai1 > 0) { pos[ai].pop_back(); pos[ai1].pop_back(); continue; } int j = pos[-ai].back(); pos[-ai].pop_back(); pos[ai].pop_back(); ans += (Get(1, 0, n - 1, j) - (i + 1)); if (i + 1 <= j - 1) Add(1, 0, n - 1, i + 1, j - 1, 1); // while (j > i + 1) { // ++ans; // swap(a[j - 1], a[j]); // --j; // } if (ai > 0) { // swap(a[i], a[i + 1]); ++ans; } } 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...