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;
}
标签:740,int,rev,Codeforces,我们,flag,Round
From: https://www.cnblogs.com/ycllz/p/17060096.html