We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
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;
}
Lily's Homework
You are viewing a single comment's thread. Return to all 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; }