Submission #1188762

#TimeUsernameProblemLanguageResultExecution timeMemory
1188762GoBananas69Arranging Shoes (IOI19_shoes)C++20
100 / 100
406 ms150112 KiB
#include <iostream> #include <map> #include <queue> using namespace std; const int N = 2e5 + 5; long long tree[4 * N]; long long fix[N]; map<int, queue<int>> v; void update(int i, int L, int R, int p) { if (L == R) { tree[i] = 1; return; } int x = 2 * i, y = x + 1; int m = (L + R) / 2; if (p <= m) { update(x, L, m, p); } else { update(y, m + 1, R, p); } tree[i] = tree[x] + tree[y]; } long long query(int i, int L, int R, int l, int r) { if (l > r) return 0; if (L == l && R == r) { return tree[i]; } int m = (L + R) / 2; return (query(i * 2, L, m, l, min(r, m)) + query(i * 2 + 1, m + 1, R, max(m + 1, l), r)); } long long count_swaps(vector<int> s) { long long n = s.size(); s.insert(s.begin(), 0); for (int i = 1; i <= n; i++) { v[s[i]].push(i); } long long op = 0; for (int i = 1; i <= n; i++) { if (query(1, 1, n, i, i)) continue; long long a = s[i]; int ib = v[-a].front(); v[-a].pop(); v[a].pop(); op += (ib - i - query(1, 1, n, i, ib)); if (a < 0) op--; update(1, 1, n, ib); update(1, 1, n, i); } return op; }
#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...