假设数字1~i-1已经全部归位,则第i到第n个数为无序区间。
如果i在无序区间的前半段,那么直接将i换到第i个位置上。
否则先将i换到无序区间的前半段,再将i归位。这样每个数最多操作两次即可归位。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 10000 + 10; 5 int a[maxn]; 6 vector<pair<int, int> > ans; 7 8 void op(int L, int R) 9 { 10 ans.push_back(make_pair(L, 2*R-L-1)); 11 int t = R - L; 12 for(int i = L; i < R; i++) swap(a[i], a[i+t]); 13 } 14 15 int main() 16 { 17 //freopen("in.txt", "r", stdin); 18 19 int T; scanf("%d", &T); 20 while(T--) 21 { 22 int n; scanf("%d", &n); 23 for(int i = 1; i <= n; i++) scanf("%d", &a[i]); 24 ans.clear(); 25 for(int i = 1; i < n; i++) 26 { 27 if(a[i] == i) continue; 28 int j; 29 for(j = i+1; j <= n; j++) if(a[j] == i) break; 30 if(j - i <= n - j + 1) op(i, j); 31 else 32 { 33 int t = (n - i + 1) / 2; 34 op(n-2*t+1, n-t+1); 35 i--; 36 } 37 } 38 int sz = ans.size(); 39 printf("%d\n", sz); 40 for(int i = 0; i < sz; i++) printf("%d %d\n", ans[i].first, ans[i].second); 41 } 42 43 return 0; 44 }
代码君
时间: 2024-10-17 15:20:47