Codeforces Round #740 C

C. Bottom-Tier Reversals

题链
这种翻转方式 显然我们是要从后往前固定元素
我们先来判断无解情况 因为他只允许在奇数位置rev 那么我们可以发现每个位置的奇偶性都不会改变的
所以钥匙一开始给出的序列违背了 就是无解
因为他的rev都是至少两个位置间隔 我们肯定要将两个东西打包放在后面去
我们假设 我们有 。。。。。i。。。。i+1。。。。i是奇数
我们可以现在rev i 将i放最前面 i 。。。。。。。i+1 。。。。。
然后将i和i+1贴贴 。。。。。。。i i+1 。。。。。。
然后再将i+1后面那个位置rev 。i+1 i 。。。。。。。。
最后我们再 rev 3 i i+1 。。。。。。。。。。
然后一次rev 全部就可以放在后面去了
刚好五次 符合题目要求

int n,pos[N],a[N];
vector<int>ans;
void rev(int l,int r){
    reverse(a+l,a+r+1);
    ans.push_back(r);
    for(int i=1;i<=r;i++)pos[a[i]]=i;
}
void solve(){
    cin>>n;
    int flag=0;
    ans.clear();
    for(int i=1;i<=n;i++){
        cin>>a[i],pos[a[i]]=i;
        if(a[i]%2!=i%2)flag=1;
    }
    if(flag){cout<<-1<<endl;return;}
    for(int i=1;i<n;i+=2){
        rev(1,pos[i]);
        rev(1,pos[i+1]-1);
        rev(1,pos[i+1]+1);
        rev(1,3);
        rev(1,n-i+1);
    }
    rev(1,n);
    cout<<ans.size()<<endl;
    for(auto i:ans)cout<<i<<' ';cout<<endl;
}

posted @ 2023-01-18 16:12  ycllz  阅读(21)  评论(0)    收藏  举报