【分治思想的模拟】
【分治思想的模拟】
写法很像归并排序
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
一般都是递归 代码一般都很简洁
Reverse 2^i
https://atcoder.jp/contests/abc413/tasks/abc413_e
题目大意
一个排列,下标从0到1<<n-1,每次可以选择一个二进制区间(0-1,0-3,4-7这种)进行置换,求字典序最小
思路
归并排序方法模拟即可
注意调换时判断区间首位,交换区间即可,不用逆着交换
代码
const int N=(1<<18)+10;
int n;
int p[N];
//从大区间->小区间
//类似归并排序做法
void dfs(int l,int r){
if(l==r) return;
int mid=(l+r)>>1;
dfs(l,mid);dfs(mid+1,r);
if(p[l]>p[mid+1]){//调换区间即可
for(int i=l;i<=mid;i++){
swap(p[i],p[mid+i+1-l]);
}
}
return;
}
void solve(){
int n;
cin>>n;
for(int i=0;i<(1<<n);i++) cin>>p[i];
dfs(0,(1<<n)-1);
for(int i=0;i<(1<<n);i++){
cout<<p[i]<<" ";
}
cout<<endl;
}