Submission #622456

#TimeUsernameProblemLanguageResultExecution timeMemory
622456JomnoiArranging Shoes (IOI19_shoes)C++17
100 / 100
160 ms139644 KiB
#include <bits/stdc++.h> #include "shoes.h" using namespace std; const int MAX_N = 2e5 + 5; int N; long long ans; queue <int> pos[MAX_N]; bool visited[MAX_N]; int tree[MAX_N]; void add(int x, int v) { for(int i = x; i < MAX_N; i += (i & -i)) { tree[i] += v; } } int get(int x) { int res = 0; for(int i = x; i >= 1; i -= (i & -i)) { res += tree[i]; } return res; } long long count_swaps(vector <int> s) { for(int i = 1; i < MAX_N; i++) { tree[i] = i & -i; } N = s.size(); s.insert(s.begin(), 0); for(int i = 1; i <= N; i++) { if(s[i] < 0) { s[i] = N + s[i] + 1; } pos[s[i]].push(i); } for(int i = 1; i <= N; i++) { if(visited[i] == true) { continue; } int now = s[i], nxt = N - s[i] + 1, nxtpos; if(s[i] > N / 2) { ans--; } nxtpos = pos[nxt].front(); pos[nxt].pop(); pos[now].pop(); ans += get(nxtpos) - get(i); add(nxtpos, -1); visited[i] = visited[nxtpos] = true; } 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...