UVa 1611 - Crane(构造法)

给出一个1到n的排列,每次可以交换任意偶数区间的前一段和后一段,输出一种操作方法似的操作之后为升序排列。

类似于那个翻煎饼的题,从左开始进行排列。

#include
#include
#include
using namespace std;
const int maxn=10010;
int n,a[maxn],pos[maxn];
struct range{
    int l,r;
    range(int l=0,int r=0):l(l),r(r){}
    void print(){
        printf("%d %d\n",l+1,r+1);
        return;
    }
};
vector ans;
void Swap(int sta,int len){
    for(int i=0;i(n-i)/2)//调整i到能够一次调好的位置。
            Swap(pos[i]*2-n,n-pos[i]);
        Swap(i,pos[i]-i);
    }
    return;
}
void print_ans(){
    printf("%d\n",(int)ans.size());
    for(int i=0;i


你可能感兴趣的:(算法竞赛入门经典,(第二版),第八章,高效算法设计)