Codeforces 873D. Merge Sort 分治 + 构造

本篇博客详细介绍了如何解决Codeforces上的873D问题,该问题涉及分治策略和归并排序。当给定的序列已经有序时,特殊归并排序不再进行递归,要求构造一个序列使得mergesort函数被调用k次。通过分析可以确定总调用次数为奇数,并提供了一种递归交换元素的方法来构造满足条件的序列,直到满足k=1或区间已完全遍历为止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:Codeforces 873D

题意:给出一种特殊的归并排序,分治的方法同普通的归并排序一样,只是如果当前待排序的区间已经是有序的,就不会再继续递归了,让你构造一个会调用k次mergesort函数的序列。

思路:因为我们上来就会调用一次mergesort函数,并且只要当前待排序区间不是有序的,那么在该层递归里就会调用两次mergesort,因此可以推出总调用次数一定是个奇数。然后我们递归的构造答案序列(令答案序列初始有序),若k > 2, 我们就将当前区间的a[mid]和a[mid - 1]交换一下,这样可以保证下一层递归传进去的区间一定是个有序区间,这不会样影响k==1时候的退出(按照题给定义,必须当前区间有序才能退出)。交换后k就少了2,一直这样递归构造,出口就是l + 1 == r或者k == 1.

代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值