Codeforces 873D Merge Sort
2017-10-22 23:09
393 查看
题意:
构造一个1到n的排列,使的这个排列进行归并排序时,递归的次数为k。
题解:
构造法。手动画图可以发现规律,每次递归排序总是会分成两部分,因此答案只有是1,3,5,7,9,即奇数。
通过dfs来构造。在当层递归中若k已是0,则升序构造就可,否则继续递归。若dfs完之后,k仍不是0,则失败。具体见代码
构造一个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; }
相关文章推荐
- Codeforces 847 B. Preparing for Merge Sort (二分)
- Codeforces 873 D Merge Sort 【分治】
- 归并排序(merge sort)
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
- Merge-sort
- 算法导论 第二章MergeSort
- Oracle的Filter,Nest loop,Merge sort join和Hash join
- merge sort array
- 算法-排序-归并排序(MergeSort)分析
- Hive 基础(1):分区、桶、Sort Merge Bucket Join
- codeforces 362 C. Insertion Sort(树状数组,逆序数)
- 合并(归并)排序(MergeSort)
- sort merge join导致temp被爆菊
- 【算法导论学习-002】归并排序(MergeSort)
- 一些知识点总结(HeapSort, MergeSort, QuickSort, PrefixTree, TopologicalSort)
- 合并排序连接(Merge Sort Join)-2
- 分治法——归并排序(MergeSort)
- B. Preparing for Merge Sort
- 排序算法总结之归并排序 Merge Sort
- Merge Sort [Basic] C程序 实现排序功能