Codeforces 873D Merge Sort

来源:互联网 发布:霍光为什么不篡位知乎 编辑:程序博客网 时间:2024/06/09 23:55

题意:

构造一个1到n的排列,使的这个排列进行归并排序时,递归的次数为k。

题解:

构造法。手动画图可以发现规律,每次递归排序总是会分成两部分,因此答案只有是1,3,5,7,9,即奇数。

通过dfs来构造。在当层递归中若k已是0,则升序构造就可,否则继续递归。若dfs完之后,k仍不是0,则失败。具体见代码

#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define maxn 100000+10using namespace std;typedef long long ll;int n,k,now;int ans[maxn];void dfs(int left,int right){    if(k==0)    {        int from=now-(right-left)+1;        int nfrom=from;        for(int i=left;i<right;i++)            ans[i]=nfrom++;        now=from-1;        return;    }    if(left==right-1)     {        ans[left]=now--;        return;    }    int mid=(left+right)/2;    k-=2;    dfs(left,mid);    dfs(mid,right);}int main(){ //   freopen("input.txt","r",stdin);  //  freopen("output.txt","w",stdout);    while(~scanf("%d %d",&n,&k))    {        if(k%2==0)         {            printf("-1\n");            continue;        }        now=n;        k--;        dfs(0,n);        if(k) printf("-1\n");        else        {            for(int i=0;i<n-1;i++) printf("%d ",ans[i]);            printf("%d\n",ans[n-1]);        }    }    return 0;}


原创粉丝点击