【分治思想的模拟】

【分治思想的模拟】

写法很像归并排序

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;
}
posted @ 2025-07-06 18:02  White_ink  阅读(13)  评论(0)    收藏  举报