Submission #750940

#TimeUsernameProblemLanguageResultExecution timeMemory
750940anaduguleanuArranging Shoes (IOI19_shoes)C++14
100 / 100
170 ms139792 KiB
#include <iostream> #include <queue> #define MAX 200000 using namespace std; ///ifstream cin ("c.in"); ///ofstream cout ("c.out"); queue <int> pos[MAX + 10]; int tree[MAX + 10], visited[MAX + 10]; void update(int pos, int val) { for (int i = pos; i <= MAX; i = i + (i & -i)) tree[i] = tree[i] + val; } int query(int pos) { int ans = 0; for (int i = pos; i >= 1; i = i - (i & -i)) ans = ans + tree[i]; return ans; } long long count_swaps(vector <int> v) { for (int i = 1; i <= MAX; i++) tree[i] = (i & -i); int n = v.size(); v.insert(v.begin(), 0); for (int i = 1; i <= n; i++) { if (v[i] < 0) v[i] = v[i] + n + 1; pos[v[i]].push(i); } long long ans = 0; for (int i = 1; i <= n; i++) if (visited[i] == 0) { int current = v[i], next = n - v[i] + 1; if (v[i] > n / 2) ans--; int nextpos = pos[next].front(); pos[next].pop(); pos[current].pop(); ans = ans + query(nextpos) - query(i); update(nextpos, -1); visited[nextpos] = 1; visited[i] = 1; } 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...