fork(1) download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5.  
  6. int count_inversions(vector<int> a) {
  7. int n = a.size(), inv = 0;
  8. vector<int> temp(n);
  9.  
  10. function<void(int, int)> merge_sort = [&](int l, int r) {
  11. if (r - l <= 1) return;
  12. int m = (l + r) / 2;
  13. merge_sort(l, m);
  14. merge_sort(m, r);
  15.  
  16. int i = l, j = m, k = l;
  17. while (i < m && j < r) {
  18. if (a[i] <= a[j]) temp[k++] = a[i++];
  19. else {
  20. inv += m - i;
  21. temp[k++] = a[j++];
  22. }
  23. }
  24. while (i < m) temp[k++] = a[i++];
  25. while (j < r) temp[k++] = a[j++];
  26. for (int i = l; i < r; ++i) a[i] = temp[i];
  27. };
  28.  
  29. merge_sort(0, n);
  30. return inv;
  31. }
  32.  
  33. void solve() {
  34. int n;
  35. cin >> n;
  36. vector<int> p(n);
  37. for (int &x : p) cin >> x;
  38.  
  39. int best = LLONG_MAX;
  40. int total = 1 << n;
  41.  
  42. vector<int> a(n);
  43.  
  44. for (int mask = 0; mask < total; ++mask) {
  45. for (int i = 0; i < n; ++i)
  46. a[i] = (mask >> i & 1) ? (2 * n - p[i]) : p[i];
  47. best = min(best, count_inversions(a));
  48. }
  49.  
  50. cout << best << '\n';
  51. }
  52.  
  53. int32_t main() {
  54. ios::sync_with_stdio(0);
  55. cin.tie(0);
  56.  
  57. int t;
  58. cin >> t;
  59. while (t--) solve();
  60. }
  61.  
Success #stdin #stdout 0s 5312KB
stdin
5
2
2 1
3
2 1 3
4
4 3 2 1
5
2 3 1 5 4
6
2 3 4 1 5 6
stdout
0
1
0
2
2