首页 > 其他分享 >题解 CF1909H

题解 CF1909H

时间:2024-01-19 20:57:05浏览次数:33  
标签:环上 题解 置换 交换 线路 2n CF1909H

题意

给定一个长度为 \(n\) 的排列 \(p\)。你可以进行不超过 \(10^6\) 次操作,每次操作是选择一个长度为偶数的区间 \([l,r]\),然后交换 \((p_l,p_{l+1}),(p_{l+2},p_{l+3}),...,(p_{r-1},p_r)\)。

你需要将排列排序。

数据范围:\(n \le 3\times 10^5\)。

题解

刚才有个群友问我 Z 菜鸡发生肾摸事了,我说怎么回事?给我发了几张 CF 分数对比图,我一看!嗷!原来是昨天,我打了一场 CF,爆零了,掉分到 newbie ,又被嘲讽了。

三年之期已到!

提供另一种 \(2n\) 次操作的做法。

首先假设 \(n\) 是奇数。

我们考虑交替执行 \((1,n-1)\) 和 \((2,n)\),执行 \(n\) 次,观察执行后的结果。下面是一张做工粗糙的图:

可以发现第 \(i\) 号位置被交换到了第 \(n-i+1\) 上,而且每两条线路都相交了恰好一次。

不妨称终点在 \(i\) 号点的线路为第 \(i\) 条线路。

在两条线路相交的时,我们可以选择交换这两条线路的起点。考虑在这些操作中加入这些交换来把排列变成 \(p\)。

设 \(to_i = p_{n-i+1}\),并给 \(i \to to_i\) 连边,连的边形成一些置换环。一条边 \(x\to y\) 表示我们要把第 \(x\) 条线路的起点换到第 \(y\) 条线路上。这时,前文的交换线路可以看成是 每个时刻我们都有机会交换一些 \(to_x\) 和 \(to_y\),且每对 \((x,y)\) 都出现了恰好一次。

我们遇到一对 \((x,y)\) 的时候,如果 \(x\) 和 \(y\) 在一个置换环上,那么就交换,此时置换环会分裂,\(x\) 和 \(y\) 就不在一个置换环上了。执行完所有交换后,每两个点都不在一个置换环上,因此一定有 \(to_i=i\)。

由于置换环最多分裂 \(n-1\) 次,所以这样做最多操作 \(2n-1\) 次。

然而这还没完:这题 \(n\) 是 \(3\times 10^5\),所以我们不能暴力做!注意到对于一个置换环,最早的能交换的数对 \((x,y)\) 一定满足 \(x\) 和 \(y\) 在对置换环的节点排序后相邻,所以只要对于每个环维护一个从小指向大的链表,环分裂的时候把小的那边拿出来删掉并重构即可。

\(n\) 是偶数的做法是差不多的,无非是把 \((1,n-1)\) 和 \((2,n)\) 换成 \((1,n)\) 和 \((2,n-1)\)。

时间复杂度 \(\mathcal O(n\log^2 n)\) 或 \(\mathcal O(n \log n)\),操作次数不超过 \(2n-1\)。

代码

标签:环上,题解,置换,交换,线路,2n,CF1909H
From: https://www.cnblogs.com/zkyJuruo/p/17936724

相关文章

  • $20240119$ 练习题解
    \(20240119\)练习题解CF472D通过尝试我们容易发现,与点\(1\)最近的点一定是直接儿子。我们要是把它作为突破点,那就成功了一半了。假设点\(2\)与点\(1\)最近,又假设我们可以用函数\(F(x)\)来确定\(x\)点的子树形态。那我们会发现如果我们还有剩余的节点,那么剩余的节点......
  • 洛谷 P9869 [NOIP2023] 三值逻辑 题解
    Solution模拟程序,容易发现每个点最后的取值都是定值或一个点的初始值(可能是该值取反)。最后是定值的点可以确定初始值,最后取值由该点决定的点也可以确定取值。求出这些取值,答案加上取之为U的点的个数。即第\(i\)个点最后的取值是\(to_i\)的初始值,\(sg_i\)表示是否取反,那......
  • 洛谷 P9751 [CSP-J 2023] 旅游巴士 题解
    Solution能在起点等\(k\)的非负整数倍相当于能在任意点等\(k\)的非负整数倍。由于离开的时间要是\(k\)的负整数倍,将每个点拆成\(k\)个点,\(dis_{i,j}\)表示到了第\(i\)个点长度\(\bmod\text{}k\equivj\)的最短路径。转移时若时间未到,直接在原地等\(k\)的负整......
  • 洛谷 P9745 「KDOI-06-S」树上异或 题解
    Solution树形DP好题。PartI部分分类比下文为简单,我们称一个连通块的权值为连通块内点的异或和。考虑链的部分分,显然可以设\(f_{i}\)是前\(i\)个点所有断边方案的权值和,对于每个点枚举上一条断的边转移。令\(s_i=\bigoplus_{j=1}^{i}a_j\),则\(f_i=\sum_{j=0}^{i-1}(s......
  • 洛谷 P9579「Cfz Round 1」Elevator 另类题解
    一个赛时想到的另类DP做法。Solution容易将原题转化为一个人乘电梯每次上下一层。对于\(a_i<b_i\)是好处理的,记\(\displaystylem=\max_{1\leqi\leqn}\{a_i,b_i\}\),只需要跑到\(m\)即可解决所有这种条件。对于\(a_i>b_i\)的条件,我们除了到\(m\)外,还需要额外地从......
  • 洛谷 P9575 「TAOI-2」喵了个喵 Ⅳ 题解
    Solution先求出所有数的最大公约数\(d\),然后将每个数约去\(d\)。将约去后的数均分,约去前的数也均分。下文讨论的数都是约去\(d\)后的数(包括取的\(x\))。\(n\)为偶数,取\(x=1\),对半分即可。\(n\)不为偶数,且有奇数个偶数。取\(x=2\),设奇数和偶数分别有\(x,y\)个,B组取......
  • 洛谷 P9915 「RiOI-03」3-2 题解
    Preface为啥有蓝啊,这题在机房里15min左右就切了,反倒是2A做了1h。。Solution将矩阵逆时针旋转\(90^{\circ}\),你会发现这是一棵线段树,是父亲左儿子的节点颜色是\(0\),是右儿子的节点颜色是\(1\)。容易发现,联通块一定是一条链。具体地,你从给定的点向上跳,跳到第一个与自己......
  • CF1895E Infinite Card Game 题解
    Solution根据贪心策略,可以发现出完一张牌后对手的出牌是固定的。同理可以算出Monocarp出完一张牌\(a\)后下一次出的牌\(to_a\)。\(a\)和\(to_a\)胜负状态相同。可以发现对所有\(a\)建\(a\toto_a\)后形成的图是内向基环树,一遍dfs即可求出答案。时间复杂度\(\m......
  • /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found问题解决
    有一个go实现的项目代码最近有更新,自己在开发环境上手动构建并运行都没有问题(构建和运行时相同环境,肯定没有问题^_^)。后面通过jenkins构建镜像也没有问题,运行时却报错 之前的版本在jenkins上构建也是成功的,后沟通得知jenkins集群版本最近有更新 那么,大概知道原因了,由于jenk......
  • CF1214E题解
    PetyaandConstructionSet题目传送门题解一个构造题,结论挺容易猜的。观察到关键信息:\(d_i\len\)。所以我们先把所有奇数编号的点按对应的\(d\)从大到小组成一条链,然后依次考虑偶数号点应该接在链上的哪个点后,容易知道这个点为链上的第\(i+d-1\)个。特殊的,如果接在了最后......