首页 > 其他分享 >置换 & 基环树题

置换 & 基环树题

时间:2024-04-20 21:44:26浏览次数:22  
标签:le10 排列 基环树题 Solution Statement mathcal 置换 dis

T1

Statement

给一个长度为 \(n(\le10^5)\) 的排列 \(\{a_i\}\)。求一个排列 \(\{b_i\}\),使得 \(a_i=b_{b_i}\),或输出不存在。

Solution

先把所有排列变成置换

对于任意排列 \(\{p_i\}\),它转成置换后都是 \(i\to p_i\),故有 \(i\to p_i\to p_{p_i}\to p_{p_{p_i}}\to...\)

所以所有原来的 \(i\to a_i\) 变成了 \(i\to b_i\to a_i\),需要多隔一个数

若一个环的大小为奇数,可以通过每次跳两步填表,来构造出同样大小的答案;

若这个环的大小为偶数,可以把它和另一个大小相同的环镶嵌,得到答案(若没有则无解)。

T2

Statement

\(n(\le10^5)\) 个节点的带权基环树和 \(m(\le10^5)\) 组询问,每次询问两个点的最短距离。

Solution

预处理环上每个点为根向外延伸出的子树内的信息,和环上距离前缀和(断环为链)

若询问的两个点 \(u,v\) 在同一个子树内,则回答 \(dis_u+dis_v-2\cdot dis_{lca(u,v)}\),其中 \(dis_i\) 表示 \(i\) 到 \(i\) 所在子树的根节点的距离

若不在同一子树内,需要考虑 \(u,v\) 所在子树的根节点 \(p,q\) 在环上的最短距离 \(res\),有顺时针走和逆时针走两种走法,用前缀和算、取 \(\min\) 即可;回答 \(dis_u+dis_v+res\).

预处理 \(\mathcal O(n)\),在线回答 \(\mathcal O(m\log n)\),离线可做到 \(\mathcal O(m)\).

T3

Statement

给长度为 \(n(\le10^5)\) 的排列 \(\{a_i\}\)。定义移动次数为:从 \(x=1\) 开始,每次 \(x\gets a_x\),直到 \(x\) 再次变成 \(1\) 的操作次数。你可以对排列进行 \(m(\le 2n)\) 次交换,求能达到的最多移动次数。

Solution

先转成置换,我们要让 \(1\) 所在环的大小最大

因为连边是 \(i\to a_i\),一次交换 \(a_i,a_j\) 的效果是删除 \(i\to a_i\)、\(j\to a_j\),添加 \(i\to a_j\)、\(j\to a_i\)

画一下图发现若 \(a_i,a_j\) 在同一个环内,效果是把它断成两个环;

若 \(a_i,a_j\) 不在同一个环内,效果是把它们合成一个环

所以我们贪心地将 \(1\) 以外的环按大小从大到小地合并到 \(1\) 所在的环,最多合并 \(m\) 次

最终输出 \(1\) 所在环的大小。

T4

Statement

给定一个 \(3\) 行 \(n(\le10^5)\) 列的表格,第一行是 \(1\sim n\) 的排列,后两行每个数 \(\in[1..n]\)。现在我们要删去一些列,之后将每一行排序,排完后需要保证每一列 \(3\) 个数相等。求删掉的最少列数。

Solution

记 \(a_i,b_i,c_i\) 表示第 \(1,2,3\) 行中 \(i\) 的出现次数。

可以发现对于所有 \(i\),\(a_i,b_i,c_i\) 其中一个为 \(0\) 时,其中一行没有数字 \(i\),又因为要求三行相同所以另外两行也不能有数字 \(i\),故将所有包含数字 \(i\) 的下标元素及其所在列删除。

重复这个过程,最终 \(a_i,b_i,c_i\) 均全 \(0\) 或全不为 \(0\),又因为第一列为排列,所以 \(a_i\) 均为 \(1\),因为元素总数相同,故 \(b_i,c_i\) 也均为 \(1\)。此时三行排序后相同。

我们用队列优化一下,每个数最多删一次,\(\mathcal O(n)\)

标签:le10,排列,基环树题,Solution,Statement,mathcal,置换,dis
From: https://www.cnblogs.com/laijinyi/p/18148227

相关文章

  • 循环群与置换群
    循环群(CyclicGroup)生成子群对于任意群\(G\)的非空子集\(A\),定义\(\langA\rang=\bigcap\limits_{i\inI}H_i\),其中\(H_i\)是所有包含\(A\)的\(G\)的子群。称\(\langA\rang\)是由\(A\)生成的子群。容易理解与证明,\(\langA\rang\)是包含\(A\)的\(G\)的最小子群。我们可以......
  • 置换 杨表
    置换基础双射将置换\(p\)唯一分解为若干循环(轮换分解),对于每个循环以其最大值作为开头,再将所有循环按照字典序升序排序,构成一个新的置换。这是\(n\)阶排列到\(n\)阶排列的双射。右推左即为按照前缀最大值划分段从而得到这些循环。例:\(n\)阶随机排列中\(1\)所在循环长......
  • 置换矩阵
    矩阵,可以用二维数组表示出来用二维数组的下标来显示矩阵如下:1 2 34 5 67 8 9原矩阵   1  4 72  5 83  6 9置换矩阵[0][0][0][1][0][2][1][0][1][1][1][2][2][0][2][1][2][2] [0][0][0][1][0][2][1][0] ......
  • 基于SpringBoot+Vue的大学生二手闲置物品置换交易管理系统的详细设计和实现(源码+lw+
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我自己的网站自己的小程序(小蔡coding)代码参考数据库参考源码获取前言......
  • 3.2_3 页面置换算法
    3.2_3页面置换算法  请求分页存储管理与基本分页存储管理的主要区别:  在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。  若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。  页面置换算......
  • 置换群 / Polya 原理 / Burnside 引理 学习笔记
    置换群/Polya原理/Burnside引理学习笔记在GJOI上做手链强化,经过长达三小时的OEIS和手推无果后开摆,喜提rnk12,故开始学习置换群相关内容。笔记主要以Polya原理和Burnside引理的应用为主,所以会非常简单,很大一部分的群论概念和证明不会写,因为我不会。基础群论定......
  • 置换环
    结论每次交换任意两个数,将一个排列排序。结论\(1\):其最小操作数为\(n-k\)。结论\(2\):其操作方案数为\((n-k)!\prod\limits_{i=1}^{k}\dfrac{l_i^{l_i-2}}{(l_i-1)!}\)。其中\(n\)为长度,\(k\)为置换环个数,\(l_i\)为第\(i\)个置换环长度。证明引理:若交换的两个数在......
  • 最少交换次数 置换环 LeetCode 2471. 逐层排序二叉树所需的最少操作数目
    voidMain(){ varroot=newTreeNode(1) { left=newTreeNode(3) { left=newTreeNode(7), right=newTreeNode(6) }, right=newTreeNode(2) { left=newTreeNode(5), right=newTreeNode(4) } }; varr=newSolution().Minimu......
  • 置换群
    定义一个集合,有运算(埋下伏笔),集合内的东西运算后还是在集合内。求的东西本质不同的方案数这个集合里元素很多,肯定不能枚举。可以理解成联通块数?(也许没什么**用)不同带权方案权值和不会。Bornside引理\[\frac{1}{\text{置换种数}}\times(\sum_{\text{每一种置换}}\text{仅考......
  • Maven配置换仓库出现错误1
    一:概述mvninstall后出现错误,寻找解决办法。二:具体过程<1>命令行使用mvninstall报错[INFO]Scanningforprojects...[INFO]------------------------------------------------------------------------[INFO]BUILDFAILURE[INFO]-----------------------------------------......