news 2026/4/18 5:56:13

题解:AtCoder AT_awc0030_d Telephone Game of Messages

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
题解:AtCoder AT_awc0030_d Telephone Game of Messages

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

AtCoder:D - Telephone Game of Messages

【题目描述】

There areN NNstudents in Takahashi’s class, numbered from1 11toN NN. The class plays a message-passing game (telephone game).
高桥的班上有N NN名学生,编号从1 11N NN。这个班级在玩一个传话游戏(电话游戏)。

For each studenti ii(1 ≤ i ≤ N 1 \leq i \leq N1iN), there is exactly one designated studentT i T_iTito whom they pass the message (T i ≠ i T_i \neq iTi=i).
对于每名学生i ii1 ≤ i ≤ N 1 \leq i \leq N1iN),恰好有一名指定的学生T i T_iTi作为其传话对象(T i ≠ i T_i \neq iTi=i)。

The game proceeds as follows. First, a starting students ssis chosen. Leta 0 = s a_0 = sa0=s, and fork ≥ 0 k \geq 0k0, define the sequencea 0 , a 1 , a 2 , … a_0, a_1, a_2, \ldotsa0,a1,a2,bya k + 1 = T a k a_{k+1} = T_{a_k}ak+1=Tak.
游戏进行如下:首先,选择一名起始学生s ss。令a 0 = s a_0 = sa0=s,对于k ≥ 0 k \geq 0k0,通过a k + 1 = T a k a_{k+1} = T_{a_k}ak+1=Tak定义序列a 0 , a 1 , a 2 , … a_0, a_1, a_2, \ldotsa0,a1,a2,

Initially,a 0 a_0a0is marked as “visited.” Then, fork = 1 , 2 , … k = 1, 2, \ldotsk=1,2,in order, the following is repeated:
初始时,a 0 a_0a0被标记为"已访问"。然后,依次对k = 1 , 2 , … k = 1, 2, \ldotsk=1,2,重复以下操作:

  • Ifa k a_kakis already visited, the message stops there.
    如果a k a_kak已被访问,则消息在此处停止。
  • Otherwise, marka k a_kakas visited and proceed to the nextk kk.
    否则,将a k a_kak标记为已访问,并继续下一个k kk

Since the number of students is finite, the message always stops after a finite number of steps.
由于学生人数有限,消息总是会在有限步后停止。

Letv vvdenote the student reached when the process stops (i.e.,a k a_kakat the time of stopping). The studentv vvwas previously marked as visited, and repeatedly applyingT TTstarting fromv vvwill eventually return tov vv. That is, following the pathv , T v , T T v , … v, T_v, T_{T_v}, \ldotsv,Tv,TTv,will eventually reachv vvagain. The number of students on the path starting fromv vvand returning tov vv(includingv vvitself) is called themessage loop lengthfor starting students ss.
v vv表示过程停止时到达的学生(即停止时的a k a_kak)。学生v vv先前已被标记为已访问,从v vv开始重复应用T TT最终会回到v vv。也就是说,沿着路径v , T v , T T v , … v, T_v, T_{T_v}, \ldotsv,Tv,TTv,最终会再次到达v vv。从v vv出发并回到v vv的路径上的学生人数(包括v vv自身)称为起始学生s ss消息环长度

For each case where the message starts from student1 11, student2 22, …, studentN NN, find the message loop length.
对于消息分别从学生1 11、学生2 22、……、学生N NN开始的情况,求消息环长度。

【输入】

N NN
T 1 T_1T1T 2 T_2T2… \ldotsT N T_NTN

  • The first line contains an integerN NN, representing the number of students.
  • The second line containsN NNintegersT i T_iTi, separated by spaces, representing the recipient of each studenti ii’s message.

【输出】

C 1 C_1C1C 2 C_2C2… \ldotsC N C_NCN

  • LetC i C_iCibe the message loop length when the message starts from studenti ii. OutputC i C_iCifori = 1 , 2 , … , N i = 1, 2, \ldots, Ni=1,2,,Nin order, separated by spaces, on a single line.

【输入样例】

4 2 3 4 2

【输出样例】

3 3 3 3

【算法标签】

#图的遍历-DFS#

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;constintN=200005;intn,t[N],ans[N];// t: 指向的下一个位置, ans: 存储结果(环的长度)boolvis[N];// 访问标记// 深度优先搜索,计算从节点u开始的环长度voiddfs(intu){// 如果已经计算过,直接返回if(ans[u]){return;}// 如果访问到已标记的节点,说明找到了环if(vis[u]){intlen=1;intv=t[u];// 计算环的长度while(v!=u){len++;v=t[v];}// 为环上所有节点设置结果ans[u]=len;v=t[u];while(v!=u){ans[v]=len;v=t[v];}return;}// 标记当前节点已访问vis[u]=true;dfs(t[u]);// 递归探索下一个节点vis[u]=false;// 回溯,取消标记// 如果当前节点的结果还未计算,则继承下一个节点的结果if(!ans[u]){ans[u]=ans[t[u]];}}intmain(){cin>>n;for(inti=1;i<=n;i++){cin>>t[i];}// 对每个未计算的节点进行DFSfor(inti=1;i<=n;i++){if(!ans[i]){// 注释掉的调试代码// cout << "i " << i << endl;// for (int i=1; i<=n; i++)// cout << vis[i] << " ";// cout << endl;dfs(i);}}// 输出结果for(inti=1;i<=n;i++){cout<<ans[i]<<" ";}cout<<endl;return0;}

【运行结果】

4 2 3 4 2 3 3 3 3
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:56:11

Wan2.2-I2V-A14B实战案例:为本地MCN机构定制AI短视频生成工作流

Wan2.2-I2V-A14B实战案例&#xff1a;为本地MCN机构定制AI短视频生成工作流 1. 项目背景与需求分析 在短视频内容爆炸式增长的今天&#xff0c;MCN机构面临着巨大的内容生产压力。传统视频制作流程需要经历脚本创作、拍摄、剪辑等多个环节&#xff0c;不仅耗时耗力&#xff0…

作者头像 李华
网站建设 2026/4/18 5:53:30

OpenCode实战案例:用AI助手10分钟完成CSV数据统计脚本,亲测好用

OpenCode实战案例&#xff1a;用AI助手10分钟完成CSV数据统计脚本&#xff0c;亲测好用 1. 引言&#xff1a;当数据分析遇上AI编程助手 作为一名数据分析师&#xff0c;我每周都要处理大量CSV文件。常规的数据统计工作虽然简单&#xff0c;但重复编写类似的Python脚本实在浪费…

作者头像 李华
网站建设 2026/4/18 5:52:36

别再自己画封装了!用这三个免费网站,5分钟搞定AD原理图和PCB库

硬件设计效率革命&#xff1a;三款免费工具快速生成AD封装库全攻略 刚入行硬件设计那会儿&#xff0c;最让我头疼的就是画封装。记得第一次画QFN封装时&#xff0c;因为引脚间距量错0.1mm&#xff0c;导致打样回来的板子全部报废&#xff0c;那种挫败感至今难忘。后来发现&…

作者头像 李华
网站建设 2026/4/18 5:49:12

113页精品PPT | 智慧校园智能化系统方案

这份文档详细介绍了智慧校园系统的整体架构、功能模块及实际应用案例。智慧校园以数字化和网络化为基础&#xff0c;通过物联网、人工智能等技术实现教学、管理、服务等校园功能的全面信息化。系统涵盖一卡通、消费管理、门禁管理、车辆管理、考勤管理等多个子系统&#xff0c;…

作者头像 李华