Submission #164185

#TimeUsernameProblemLanguageResultExecution timeMemory
164185popovicirobertArranging Shoes (IOI19_shoes)C++14
100 / 100
108 ms15000 KiB
#include "shoes.h" #include <bits/stdc++.h> #define lsb(x) (x & (-x)) #define ll long long using namespace std; struct Fenwick { vector <int> aib; int n; inline void init(int _n) { n = _n; aib.resize(n + 1); } inline void update(int pos, int val) { pos++; for(int i = pos; i <= n; i += lsb(i)) { aib[i] += val; } } inline int query(int pos) { pos++; int ans = 0; for(int i = pos; i > 0; i -= lsb(i)) { ans += aib[i]; } return ans; } inline int sum(int l, int r) { return query(r) - query(l - 1); } }; long long count_swaps(std::vector<int> s) { int n = s.size() / 2; vector < vector <int> > l(n + 1), r(n + 1); int i; for(i = 0; i < 2 * n; i++) { if(s[i] < 0) { l[-s[i]].push_back(i); } else { r[s[i]].push_back(i); } } for(i = 1; i <= n; i++) { sort(l[i].rbegin(), l[i].rend()); sort(r[i].rbegin(), r[i].rend()); } Fenwick fen; fen.init(2 * n); vector <bool> vis(2 * n); ll ans = 0; for(i = 0; i < 2 * n; i++) { if(vis[i]) continue; if(s[i] < 0) { int pos = r[-s[i]].back(); vis[pos] = 1; ans += pos - i - fen.sum(i + 1, pos - 1) - 1; fen.update(pos, 1); } else { int pos = l[s[i]].back(); vis[pos] = 1; ans += pos - i - fen.sum(i + 1, pos - 1); fen.update(pos, 1); } l[abs(s[i])].pop_back(); r[abs(s[i])].pop_back(); } 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...