제출 #438862

#제출 시각아이디문제언어결과실행 시간메모리
438862farukArranging Shoes (IOI19_shoes)C++14
100 / 100
927 ms44552 KiB
#include <algorithm> #include <iostream> #include <cstring> #include <iomanip> #include <bitset> #include <math.h> #include <string> #include <vector> #include <cmath> #include <queue> #include <stack> #include <map> #define pii pair<int, int> #define ll long long using namespace std; int tree[(int)1e6]; class BIT { private: int n; public: BIT(int sizeOfTree) { n = sizeOfTree; } void update(int index, int value) { index++; while (index < n) tree[index] += value, index += index & (-index); } int query(int index) { index++; int out = 0; while (index > 0) out += tree[index], index -= index & (-index); return out; } }; void printVector(vector<int> toBePrinted) { for (int i : toBePrinted) cout << i << " "; cout << endl; } map<int, vector<int> > located; map<int, int> used; map<int, bool> matched; ll count_swaps(vector<int> S) { int n = S.size(); BIT passed(n); vector<int> dummy; for (int i : S) located[i] = dummy, used[i] = -1; for (int i = 0; i < n; i++) located[S[i]].push_back(i); ll out = 0; for (int i = 0; i < n; i++) { if (matched[i]) continue; int index = upper_bound(located[-S[i]].begin(), located[-S[i]].end(), used[-S[i]]) - located[-S[i]].begin(); int val = located[-S[i]][index]; used[S[i]] = max(used[S[i]], i); used[-S[i]] = max(used[-S[i]], val); matched[val] = true; int howManyHavPassedVal = passed.query(n - val - 1), howManyHavPassedCurr = passed.query(n - i - 1); int swaps = (val + howManyHavPassedVal) - (i + howManyHavPassedCurr); passed.update(n - val - 1, 1); if (S[i] < 0) swaps--; out += swaps; } return out; }
#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...