题解 CF1909H
题意#
给定一个长度为 的排列 。你可以进行不超过 次操作,每次操作是选择一个长度为偶数的区间 ,然后交换 。
你需要将排列排序。
数据范围:。
题解#
刚才有个群友问我 Z 菜鸡发生肾摸事了,我说怎么回事?给我发了几张 CF 分数对比图,我一看!嗷!原来是昨天,我打了一场 CF,爆零了,掉分到 newbie,又被嘲讽了。
提供另一种 次操作的做法。
首先假设 是奇数。
我们考虑交替执行 和 ,执行 次,观察执行后的结果。下面是一张做工粗糙的图:
可以发现第 号位置被交换到了第 上,而且每两条线路都相交了恰好一次。
不妨称终点在 号点的线路为第 条线路。
在两条线路相交的时,我们可以选择交换这两条线路的起点。考虑在这些操作中加入这些交换来把排列变成 。
设 ,并给 连边,连的边形成一些置换环。一条边 表示我们要把第 条线路的起点换到第 条线路上。这时,前文的交换线路可以看成是 每个时刻我们都有机会交换一些 和 ,且每对 都出现了恰好一次。
我们遇到一对 的时候,如果 和 在一个置换环上,那么就交换,此时置换环会分裂, 和 就不在一个置换环上了。执行完所有交换后,每两个点都不在一个置换环上,因此一定有 。
由于置换环最多分裂 次,所以这样做最多操作 次。
然而这还没完:这题 是 ,所以我们不能暴力做!注意到对于一个置换环,最早的能交换的数对 一定满足 和 在对置换环的节点排序后相邻,所以只要对于每个环维护一个从小指向大的链表,环分裂的时候把小的那边拿出来删掉并重构即可。
是偶数的做法是差不多的,无非是把 和 换成 和 。
时间复杂度 或 ,操作次数不超过 。
代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2021-01-19 伯努利数 学习笔记
2021-01-19 Pollard-Rho算法 学习笔记