UVa 1611 (排序 模拟) Crane

假设数字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 }
代码君

 

你可能感兴趣的:(uva)