Submission #603964

#TimeUsernameProblemLanguageResultExecution timeMemory
603964boris_mihovArranging Shoes (IOI19_shoes)C++14
100 / 100
154 ms140340 KiB
#include <iostream> #include <vector> #include <queue> typedef long long llong; const int MAXN = 100000 + 10; int a[2*MAXN], n; int fenwick[2*MAXN]; void update(int pos) { for (int i = pos ; i <= n ; i += i & (-i)) { fenwick[i]++; } } int query(int pos) { int sum = 0; for (int i = pos ; i >= 1 ; i -= i & (-i)) { sum += fenwick[i]; } return sum; } int realPos(int pos) { return pos + query(n) - query(pos-1); } bool taken[2*MAXN]; std::queue <int> q[2*MAXN]; llong count_swaps(std::vector <int> s) { n = s.size(); for (int i = 1 ; i <= n ; ++i) { a[i] = s[i-1]; q[MAXN + a[i]].push(i); } llong ans = 0, currPos = 1, next = 2; for (int i = 1 ; i <= n ; i += 2) { if (a[currPos] > 0) { q[MAXN + a[currPos]].pop(); int take = q[MAXN - a[currPos]].front(); q[MAXN - a[currPos]].pop(); ans += realPos(take) - realPos(currPos); taken[currPos] = true; taken[take] = true; update(take); } else { if (a[next] != -a[currPos]) { q[MAXN + a[currPos]].pop(); int take = q[MAXN - a[currPos]].front(); q[MAXN - a[currPos]].pop(); ans += realPos(take) - realPos(next); taken[currPos] = true; taken[take] = true; update(take); } else { q[MAXN + a[currPos]].pop(); q[MAXN + a[next]].pop(); while (taken[next]) ++next; currPos = next; ++next; while (taken[next]) ++next; } } while (taken[next]) ++next; currPos = next; ++next; while (taken[next]) ++next; } 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...