Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. typedef long double ld;
  6.  
  7. int main() {
  8. #ifdef LOCAL
  9.     freopen("input.txt", "r", stdin);
  10.     freopen("output.txt", "w", stdout);
  11. #endif // LOCAL
  12.     ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  13.  
  14.     int n;
  15.     cin >> n;
  16.  
  17.     int a[n], b[n], c[n];
  18.  
  19.     for (int i = 0; i < n; ++i) {
  20.         cin >> a[i];
  21.         b[i] = a[i];
  22.     }
  23.     sort(b, b + n);
  24.  
  25.     vector<pair<int, int>> res;
  26.  
  27.     auto reshuf = [&](int l, int r) {
  28.                       int m = (l + r + 1) / 2;
  29.  
  30.                       for (int i = l; i < m; ++i) {
  31.                           c[l + 1 + (i - l) * 2] = b[i];
  32.                       }
  33.                       for (int i = m; i <= r; ++i) {
  34.                           c[l + (i - m) * 2] = b[i];
  35.                       }
  36.  
  37.                       for (int i = l; i <= r; ++i)
  38.                           b[i] = c[i];
  39.                   };
  40.  
  41.     mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  42.  
  43.     vector<pair<int, int>> qwerty;
  44.  
  45.     reshuf(0, n - 1);
  46.     qwerty.push_back({0, n - 1});
  47.  
  48.     int ddd = 1000;
  49.  
  50.     for (int i = 0; i < ddd; ++i) {
  51.         int l = rnd() % n, r = rnd() % n;
  52.         if (l == r) continue;
  53.  
  54.         if (l > r) swap(l, r);
  55.  
  56.         reshuf(l, r);
  57.         qwerty.push_back({l, r});
  58.     }
  59.  
  60.     reshuf(0, n - 1);
  61.     qwerty.push_back({0, n - 1});
  62.        
  63.     auto shuf = [&](int l, int r) {
  64.                     int t;
  65.                     for (int i = l + 1; i <= r; i += 2)
  66.                         c[(i - l) / 2] = a[i], t = (i - l) / 2;
  67.  
  68.                     for (int i = l; i <= r; i += 2)
  69.                         c[t + 1 + (i - l) / 2] = a[i];
  70.  
  71.                     for (int i = 0; i < r - l + 1; ++i)
  72.                         a[l + i] = c[i];
  73.                 };
  74.  
  75.     int r = 0;
  76.    
  77.     for (int i = 0; i < n; ++i) {
  78.         while (a[i] != b[i]) {
  79.             int j = i + 1;
  80.  
  81.             while (n - 1 <= 2 * j - i - 1 && !(b[j] == a[i] || b[j] == a[i + 1])) j++;
  82.  
  83.             if (b[j] == a[i]) {
  84.                 qwerty.push_back({i, 2 * j - i - 1});
  85.                 reshuf(i, 2 * j - i - 1);
  86.                 continue;
  87.             } else if (b[j] == a[i + 1]) {
  88.                 qwerty.push_back({i, 2 * j - i - 1});
  89.                 reshuf(i, 2 * j - i - 1);
  90.                 res.push_back({i, i + 1});
  91.                 swap(a[i], a[i + 1]);
  92.                 continue;
  93.             }
  94.            
  95.             j = i + 1;
  96.             while (a[j] != b[i]) j++;
  97.             if ((i + j) % 2 == 1)
  98.                 r = 0, res.push_back({i, j + r}), shuf(i, j + r);
  99.             else
  100.                 r = 0, res.push_back({i + 1, j + r}), shuf(i + 1, j + r);
  101.         }
  102.     }
  103.  
  104.     reverse(qwerty.begin(), qwerty.end());
  105.    
  106.     for (auto i: qwerty)
  107.         res.push_back(i);
  108.  
  109.     cout << res.size() << endl;
  110.  
  111.     if (res.size() > 15000)
  112.         return -1;
  113.    
  114.     for (auto i: res)
  115.         cout << i.first + 1 << " " << i.second + 1 << "\n";
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement