Submission #604174

#TimeUsernameProblemLanguageResultExecution timeMemory
604174MathStudent2002Arranging Shoes (IOI19_shoes)C++14
100 / 100
109 ms17700 KiB
#include "shoes.h" #include <algorithm> typedef long long ll; const int MAXM = 200005; ll BIT[MAXM]; void add(int i, ll delta) { while (i < MAXM) { BIT[i] += delta; i += (i & (-i)); } } ll query(int i) { ll ans = 0; while (i > 0) { ans += BIT[i]; i -= (i & (-i)); } return ans; } long long count_swaps(std::vector<int> s) { int N = int(s.size()) / 2; std::vector<int> loc[2*N+2]; for (int i = 0; i < 2*N; i++) { int shoe = s[i]; if (shoe > 0) loc[shoe].push_back(i); else loc[-shoe+(N+1)].push_back(i); } std::vector<std::pair<int, int>> sloc; for (int i = 1; i <= N; i++) { for (int idx = 0; idx < int(loc[i].size()); idx++) { sloc.push_back({loc[i][idx] + loc[i+N+1][idx], i}); } } std::sort(sloc.begin(), sloc.end()); int perm[2*N]; int id[N+1]; for (int i = 0; i <= N; i++) { id[i] = 0; } for (int i = 0; i < N; i++) { int shoeid = sloc[i].second; perm[loc[N+1+shoeid][id[shoeid]]] = 2*i; perm[loc[shoeid][id[shoeid]]] = 2*i+1; id[shoeid]++; } // count inversions int M = 2 * N; ll ans = 0; for (int i = M-1; i >= 0; i--) { ans += query(perm[i]+1); add(perm[i]+1, 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...