AT_abc413_e 题解
哎呀,我是不是来晚了,题解区已经有两篇题解了。
但是他们怎么都用的递归啊!我来个循环的吧。
题意很清楚了,我就不多说了。
从小到大枚举区间长度,然后枚举每个满足长度的区间。直接看,这个区间一分为二后,需不需要交换两边的区间。直接判断两个区间的第一个数的大小就好啦,因为这是个排列嘛。
然后不就结束啦。
咦,怎么是交换?题目给定的不是翻转吗?没必要啦,如果我们这里需要交换,其实上也可以先把左右两个子数组先都翻转一下,再翻转整个就好啦。
其实上毫无难度嘛,代码也是超级短的啦。
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5+5;
int T,n,k,a[N];
int main(){
cin>>T;
while(T--){
cin>>k;n=(1<<k);
for(int i=1;i<=n;i++)cin>>a[i];
for(int len=1;len<=k;len++)for(int i=1;i<=n;i+=(1<<len))
if(a[i]>a[i+(1<<len-1)])for(int o=0;o<(1<<len-1);o++)swap(a[i+o],a[i+(1<<len-1)+o]);
for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<"\n";
}
return 0;
}