您的位置:首页 > 其它

Codeforces 873D Merge Sort

2017-10-22 23:09 393 查看
题意:

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

题解:

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

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

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 100000+10
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: