很简单的一个排序,先通过递归划分区间到最小(因为一个元素具有单调性),然后再合并两个单调区间为一个单调区间,具体看代码
模板:
void Merge(int l,int m,int r){ int i=l; int j=m+1; int k=l; while(i<=m&&j<=r) { if(a[i]>a[j]) { temp[k++]=a[j++]; } else temp[k++]=a[i++]; } while(i<=m)temp[k++]=a[i++]; while(j<=r)temp[k++]=a[j++]; for(int i=l;i<=r;i++) a[i]=temp[i];}void Merge_sort(int l,int r){ if(l>1; Merge_sort(l,m); Merge_sort(m+1,r); Merge(l,m,r); }}
例题1:
代码:
#include#include #include #include #include #include #include #include
例题2:Codeforces
归并排序逆操作
#includeusing namespace std;#define ll long long#define ls rt<<1,l,m#define rs rt<<1|1,m+1,r#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))const int N=1e5+5;const int INF=0x3f3f3f3f;int k,n;int a[N];void Merge_sort(int l,int r){ if(!k)return ; if(l+1 >1; swap(a[m],a[m-1]); k--; k--; if(k) { Merge_sort(l,m); Merge_sort(m,r); } } else return ;}int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n>>k; if(k&1) { for(int i=0;i