Submission #483216

#TimeUsernameProblemLanguageResultExecution timeMemory
483216lukaszgnieckiArranging Shoes (IOI19_shoes)C++17
100 / 100
147 ms140768 KiB
#include "shoes.h" #include <bits/stdc++.h> #define ll long long #define str string #define pii pair<int, int> #define pll pair<ll, ll> #define fi first #define se second #define vc vector<char> #define vvc vector<vc> #define vi vector<int> #define vvi vector<vi> #define vvvi vector<vvi> #define vvvvi vector<vvvi> #define vll vector<ll> #define vvll vector<vll> #define vvvll vector<vvll> #define vvvvll vector<vvvll> #define vs vector<str> #define vvs vector<vs> #define vpii vector<pii> #define vvpii vector<vpii> #define vpll vector<pll> #define vvpll vector<vpll> #define vb vector<bool> #define vvb vector<vb> #define rep(i, a, b) for (int i = (a); i < int(b); i++) #define repi(i, a, b) for (int i = (a); i <= int(b); i++) using namespace std; //TODO: SOLUTION void mktr(vi & T, int n) { int m = 1; while (m < n) m *= 2; T = vi(2 * m, 1); for (int i = m - 1; i > 0; i--) { T[i] = T[2 * i] + T[2 * i + 1]; } } void upd(vi & T, int x, int y) { x += T.size() / 2; T[x] = y; x /= 2; while (x > 0) { T[x] = T[2 * x] + T[2 * x + 1]; x /= 2; } } int get_sum(vi & T, int l, int r) { int sum = 0; l += T.size() / 2; r += T.size() / 2; while (l <= r) { if (l == 0 && r == 0) return sum; if (l % 2 == 1) { sum += T[l++]; } if (r % 2 == 0) { sum += T[r--]; } l /= 2; r /= 2; } return sum; } ll count_swaps(vi shoes) { int n = shoes.size() / 2; ll ans = 0; vector<queue<int>> pos(2 * n + 1); rep(i, 0, 2 * n) { int x = shoes[i]; if (shoes[i] < 0) x = -x + n; pos[x].push(i); } vi tr; mktr(tr, 2*n); int m = tr.size() / 2; rep(i, 0, 2 * n) { if (tr[m + i] == 0) continue; int x = shoes[i]; int y = x + n; if (x < 0) { y = -x; x = -x + n; } int ps = pos[y].front(); pos[y].pop(); pos[x].pop(); ll moves = get_sum(tr, i + 1, ps - 1); if (y > n) moves++; //cerr << i << " " << ps << " " << moves << endl; ans += moves; upd(tr, ps, 0); } return ans; } /*int main() { vi sh1 = {2, 1, -1, -2}; vi sh2 = {-2, 2, 2, -2, -2, 2}; vi sh3 = {-2, -2, -1, -1, 1, 1, 2, 2}; vi sh4 = {1, -1, -1, 1}; cout << count_swaps(sh1) << endl; cout << count_swaps(sh2) << endl; cout << count_swaps(sh3) << endl; cout << count_swaps(sh4) << endl; return 0; }*/
#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...