Submission #361424

#TimeUsernameProblemLanguageResultExecution timeMemory
361424spatarelArranging Shoes (IOI19_shoes)C++17
100 / 100
133 ms72428 KiB
#include "shoes.h" #include <math.h> #include <stdio.h> #include <queue> const int MAX_N = 100000; std::queue<int> indexes[1 + MAX_N]; int pair[2 * MAX_N]; int BIT[1 + 2 * MAX_N]; void addValue(int index, int addValue) { index++; for (int i = index; i <= 2 * MAX_N; i += i&-i) { BIT[i] += addValue; } //printf("addValue(%d, %d)\n", index - 1, addValue); } int prefixSum(int index) { index++; int answer = 0; for (int i = index; i > 0; i -= i&-i) { answer += BIT[i]; } //printf("prefixSum(%d) -> %d\n", index - 1, answer); return answer; } void pairUp(int i, int j) { pair[i] = j; pair[j] = i; } long long count_swaps(std::vector<int> s) { int n = (int)s.size() / 2; for (int i = 0; i < 2 * n; i++) { int value = abs(s[i]); if (indexes[value].empty() || s[indexes[value].front()] == s[i]) { indexes[value].push(i); } else { pairUp(i, indexes[value].front()); indexes[value].pop(); } } /* printf("%d: ", n); for (int i = 0; i < 2 * n; i++) { printf("%d ", pair[i]); } printf("\n");//*/ long long answer = 0; for (int i = 0; i < 2 * n; i++) { addValue(i, +1); } for (int i = 0; i < 2 * n; i++) { if (i < pair[i]) { addValue(i, -1); addValue(pair[i], -1); answer += prefixSum(pair[i]); if (s[i] > 0) { answer++; } } //printf("%lld ", answer); } return answer; }
#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...