题意

给出一个归并排序的算法\(mergesort\),如果对于当前区间\([l, r)\)是有序的,则函数直接返回。

否则会分别调用\(mergesort(l, mid)\)和\(mergesort(mid, r)\),其中\(mid = \left \lfloor \frac{l+r}{2} \right \rfloor\)

最后合并左右两个子区间

下面请你构造一个\(1 \sim n\)的排列,并且恰好调用\(k\)次\(mergesort\)函数完成排序

分析

首先,对函数的调用次数一定是奇数次

因为除去最开始对函数的调用,之后每次调用函数都是对左右区间成对调用的

设一开始排列\(p\)是从\(1\)到\(n\)的顺序排列

模拟\(mergesort\)函数的调用进行构造,假设当前区间为\([l,r),(r-l>1)\),并且当前调用次数未满\(k\)次

那么交换\(p[mid-1]\)和\(p[mid]\),则区间\([l,r)\)变为无序,函数调用次数增加\(2\)

左右两个子区间仍然是有序的,不断递归进行处理直到调用次数等于\(k\)或对所有区间处理完毕

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define REP(i, a, b) for(int i = a; i < b; i++) const int maxn = 100000 + 10; int n, k;
int a[maxn]; void solve(int l, int r) {
if(!k || r - l == 1) return;
k--;
int mid = (l + r) / 2;
swap(a[mid], a[mid - 1]);
solve(l, mid);
solve(mid, r);
} int main() {
scanf("%d%d", &n, &k);
k--;
if(k & 1) { printf("-1\n"); return 0; }
k >>= 1;
REP(i, 0, n) a[i] = i + 1;
solve(0, n);
if(k) printf("-1\n");
else REP(i, 0, n) printf("%d ", a[i]);
printf("\n"); return 0;
}

CodeForces 873D Merge Sort 构造 分治的更多相关文章

  1. 873D. Merge Sort

    Merge sort is a well-known sorting algorithm. The main function that sorts the elements of array a w ...

  2. codeforces 873 D. Merge Sort(分治)

    题目链接:http://codeforces.com/contest/873/problem/D 题解:这题挺简单的,除了一开始算作是调用到一次,然后每次执行操作时都会调用2次,所以最多调用几次就很好 ...

  3. Codeforces 847B - Preparing for Merge Sort

    847B - Preparing for Merge Sort 思路:前面的排序的最后一个一定大于后面的排序的最后一个.所以判断要不要开始新的排序只要拿当前值和上一个排序最后一个比较就可以了. 代码: ...

  4. 复杂度分析 quick sort&merge sort

    空间复杂度看新开了什么数据结构就够了 公式=几个点*每个点执行了多少次 二叉树都是n次 二分法查找:lgn 全部查找:n n:找一个数,但是两边都要找.相当于遍历.类似于rotated sorted ...

  5. 【CF edu 30 D. Merge Sort】

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  6. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...

  7. 【高级排序算法】1、归并排序法 - Merge Sort

    归并排序法 - Merge Sort 文章目录 归并排序法 - Merge Sort nlogn 比 n^2 快多少? 归并排序设计思想 时间.空间复杂度 归并排序图解 归并排序描述 归并排序小结 参 ...

  8. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  9. SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join

    nested loops join(嵌套循环)   驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...

随机推荐

  1. [SVN]TortoiseSVN工具培训3─使用基本流程和图标说明

    1.SVN的使用基本流程 注意:对于文件编辑方面,上图的编辑副本操作前建议进行Get lock操作,以防出现后续的冲突等异常报错. 2.SVN的基本图标说明

  2. Java—封装

    封装 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法类实现对隐藏信息的操作和访问. 封装的实现步骤:修改属性的可见性(设为private)=>创建setter和ge ...

  3. ASP.NET 上传图片到FTP

    目录: 2.代码 3.参考资料 4.IIS环境FTP配置 5.使用虚拟目录注意Server.MapPath() 1. 项目介绍 建立FTP文件服务器与应用程序分开. 下面方法中的参数为Stream因为 ...

  4. oracle中文乱码问题

    1.查看服务器端编码select userenv('language') from dual;我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK 2.执行语句 select * f ...

  5. 2018.9.8pat秋季甲级考试

    第一次参加pat考试,结果很惨,只做了中间两道题,还有一个测试点错误,所以最终只得了不到50分.题目是甲级练习题的1148-1151. 考试时有些紧张,第一题第二题开始测试样例都运行不正确,但是调试程 ...

  6. 分治——sqtx

    题目描述 Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...

  7. 最长公共单词,类似LCS,(POJ2250)

    题目链接:http://poj.org/problem?id=2250 解题报告: 1.状态转移方程: ; i<=len1; i++) { ; j<=len2; j++) { dp[i][ ...

  8. 解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题

    SurfaceView遮挡其他控件的项目背景: 最近在做播放器项目,由于底层实现是用Surface和OpenGL切换渲染,所以在布局里面同时使用了GLSurfaceView和SurfaceView,同 ...

  9. Linux(三) - 文件操作相关命令

    Ctl-A 光标移动到行首 Ctl-C 终止命令 Ctl-D 注销登录 Ctl-E 光标移动到行尾 Ctl-U 删除光标到行首的所有字符,在某些设置下,删除全行 Ctl-W 删除当前光标到前边的最近一 ...

  10. 第41章 RS-485通讯实验—零死角玩转STM32-F429系列

    第41章     RS-485通讯实验 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...