Acwing 第一次周赛(1)

再给定一个长度为 nn 的位置序列 p1,p2,…,pnp1,p2,…,pn,它是 1∼n1∼n 的一种排列。

接下来,我们会重复不断地对数列进行如下操作:

  • 重新排列数列中每个数的位置,将位于位置 ii 的数移动至位置 pipi。(如果 i=pii=pi 则该数仍移动至位置 ii)。

  • 每次操作开始时,所有数的移动同时进行,操作结束后,数列将变为一个新的 1∼n1∼n 的排列。

例如,当 n=6n=6 并且 p=[4,6,1,3,5,2]p=[4,6,1,3,5,2] 时,第一次操作后,数字 11 将移动至位置 44,数字 22 将移动至位置 66,以此类推;第二次操作后,数字 11 将移动至位置 33,数字 22 将移动至位置 22,以此类推。

你的任务是确定从 11 到 nn 的每个数字 ii,经过多少次操作后,第一次重新回到位置 ii。

例如,考虑 p=[5,1,2,4,3]p=[5,1,2,4,3],数字 11 的移动轨迹如下:

  • 第一次操作后,到达位置 55。

  • 第二次操作后,到达位置 33。

  • 第三次操作后,到达位置 22。

  • 第四次操作后,回到位置 11。

所以,经过四次操作后,数字 11 第一次回到位置 11。

值得一提的是,数字 44 经过一次操作后就回到了位置 44.

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

每组数据第一行包含整数 nn。

第二行包含 nn 个整数 p1,…,pnp1,…,pn。

输出格式

每组数据输出一行结果,包含 nn 个整数,其中第 ii 个整数表示数字 ii 第一次回到位置 ii 所经过的操作次数。

整数之间用单个空格隔开。

数据范围

对于 30%30% 的数据,1≤T≤101≤T≤10,1≤n≤101≤n≤10。

对于 100%100% 的数据,1≤T≤10001≤T≤1000,1≤n≤2×1051≤n≤2×105,1≤pi≤n1≤pi≤n。

保证 p1∼pnp1∼pn 是 1∼n1∼n 的一种排列。

保证 ∑n≤2×105∑n≤2×105(一个输入中的 TT 个 nn 相加之和不超过 2×1052×105)。

输入样例:

6

5

1 2 3 4 5

3

2 3 1

6

4 6 2 1 5 3

1

1

4

3 4 1 2

5

5 1 2 4 3

输出样例:

1 1 1 1 1

3 3 3

2 3 3 2 1 3

1

2 2 2 2

4 4 4 1 4

并查集数环结点的个数

这类数字坐标移动是个比较经典的图论模型

我拿测试样例建个图,具体如下:

image

每组交换都会形成一个闭环

对应每个环中的节点个数 tt,就是每个元素最终回到自己原来位置时需要的经过的交换轮数 tt

那么本题就是求每个元素对应环中的节点个数

我们可以采用并查集维护各个连通块(环)的连通性,然后在并查集的头节点额外维护该并查集的节点个数即可

AC源码:

#include <bits/stdc++.h>

using namespace std;

const int cmax =2e5+5;

typedef long long ll;

int p[cmax];

int s[cmax];

int find(int x)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

更多学习和讨论,欢迎加入我们!

有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

这里有2000+小伙伴,让你的学习不寂寞~·

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

这里有2000+小伙伴,让你的学习不寂寞~·

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值