Lily's Homework

  • + 0 comments

    include

    using namespace std;

    string ltrim(const string &); string rtrim(const string &); vector split(const string &);

    int countSwapsToTarget(const vector& arr, const vector& target) { int n = arr.size(); unordered_map pos; pos.reserve(n * 2); for (int i = 0; i < n; ++i) pos[target[i]] = i; vector p(n); for (int i = 0; i < n; ++i) p[i] = pos[arr[i]]; vector vis(n, 0); int cycles = 0; for (int i = 0; i < n; ++i) { if (vis[i]) continue; ++cycles; int u = i; while (!vis[u]) { vis[u] = 1; u = p[u]; } } return n - cycles; }

    int lilysHomework(vector arr) { vector asc = arr; sort(asc.begin(), asc.end()); vector desc = asc; reverse(desc.begin(), desc.end()); int swapsAsc = countSwapsToTarget(arr, asc); int swapsDesc = countSwapsToTarget(arr, desc); return min(swapsAsc, swapsDesc); }

    int main() { ofstream fout(getenv("OUTPUT_PATH")); string n_temp; getline(cin, n_temp); int n = stoi(ltrim(rtrim(n_temp))); string arr_temp_temp; getline(cin, arr_temp_temp); vector arr_temp = split(rtrim(arr_temp_temp)); vector arr(n); for (int i = 0; i < n; i++) { int arr_item = stoi(arr_temp[i]); arr[i] = arr_item; } int result = lilysHomework(arr); fout << result << "\n"; fout.close(); return 0; }

    string ltrim(const string &str) { string s(str); s.erase( s.begin(), find_if(s.begin(), s.end(), not1(ptr_fun(isspace))) ); return s; }

    string rtrim(const string &str) { string s(str); s.erase( find_if(s.rbegin(), s.rend(), not1(ptr_fun(isspace))).base(), s.end() ); return s; }

    vector split(const string &str) { vector tokens; string::size_type start = 0; string::size_type end = 0; while ((end = str.find(" ", start)) != string::npos) { tokens.push_back(str.substr(start, end - start)); start = end + 1; } tokens.push_back(str.substr(start)); return tokens; }