【题目描述】

HKE带着nnn个小朋友做游戏

现在有nnn个座位编号为111至nnn,这些小朋友也编号111至nnn。一开始所有小朋友都坐在相应的座位上。HKE的游戏可用一个nnn的排列A(A1,A2⋯An)A(A_1,A_2\cdots A_n)A(A1​,A2​⋯An​) 表示。一轮游戏时,对于所有的1≤i≤n1\leq i\leq n1≤i≤n坐在位置iii上的小朋友坐到位置AiA_iAi​上。

现在游戏进行了kkk轮,HKE想知道游戏结束后,位置1,2⋯n1,2\cdots n1,2⋯n分别坐了几号小朋友?

【输入描述】

第一行 n,kn,kn,k
第二行A(A1,A2⋯An)A(A_1,A_2\cdots A_n)A(A1​,A2​⋯An​)

【输出描述】
一行nnn个数表示位置1,2…n1,2…n1,2…n上的小朋友的编号。

SampleInputSample~~InputSample  Input

5 5
2 3 1 5 4

SampleOutputSample~~OutputSample  Output

2 3 1 5 4

【题意分析】

提供一种暴力但思维清奇的方法:

我们很容易发现,这些小朋友的操作可以用有向边来表示。

很自然地想到这些有向边会连成环,而经过k次操作后小朋友的位置会在环内不断循环。

先用tarjan进行缩点,我们可以用vector把环全部存起来,对于每个小朋友,可以通过k 对环大小取模直接找到最终位置。

时间复杂度O(N)O(N)O(N) tarjanO(n)tarjanO(n)tarjanO(n)+处理答案O(n)O(n)O(n)

Code :

#include <bits/stdc++.h>
#define rep(x,a,b) for (register int x = a; x <= b; x++)
#define cross(x,a) for (register int x = head[a]; x; x = edge[x].next)
#define MAXN 150000
using namespace std;struct Front_Link_Star {int next, to;
}edge[MAXN];vector <int> mmp[MAXN];
//vector[x][y]是第x个环的第y个元素int head[MAXN], dfn[MAXN], low[MAXN], stac[MAXN], DAG[MAXN];
int cnt[MAXN], ans[MAXN], a[MAXN], pos[MAXN];
int _cnt, idx, top, tot_circle, n, k;
bool vis[MAXN];inline void connect (int u, int v) {edge[++_cnt].to = v;edge[_cnt].next = head[u];head[u] = _cnt;
}//tarjan
void tarjan (int now) {dfn[now] = low[now] = ++idx;vis[now] = 1; stac[++top] = now;cross (i, now) {int v = edge[i].to;if (! dfn[v]) {tarjan (v);low[now] = min (low[now], low[v]);}else if (vis[v]) low[now] = min (low[now], low[v]);}if (dfn[now] == low[now]) {tot_circle++;while (int y = stac[top--]) {DAG[y] = tot_circle;cnt[DAG[y]]++;vis[y] = 0;if (now == y) break;}}
}int main () {scanf ("%d %d", &n, &k);rep (i, 1, n) {scanf ("%d", &a[i]); connect (i, a[i]);}rep (i, 1, n) if (! dfn[i]) tarjan (i);memset (vis, 0, sizeof (vis));rep (i, 1, n) {int now = i;while (! vis[now]) {mmp[DAG[i]].push_back (now);vis[now] = 1; now = a[now];}}//用vector把环存起来//mmp[i][j]表示第i个环第j个元素rep (i, 1, tot_circle) {int rest = k % cnt[i]; rep (j, 0, mmp[i].size ()-1) {ans[mmp[i][(j+rest) % cnt[i]]] = mmp[i][j];}}//k对环大小取模直接找到最终位置rep (i, 1, n) printf ("%d ", ans[i]);return 0;
}

[LGOJ5151]HKE与他的小朋友——[缩点+vector]相关推荐

  1. 【题解】LuoGu5151:HKE与他的小朋友

    原题传送门 题目描述 现在有n个座位编号为11至nn,这些小朋友也编号11至nn.一开始所有小朋友都坐在相应的座位上.HKE的游戏可用一个n的排列A(A_1,A_2\cdots A_nA(A 1 ​ ...

  2. 【Week8作业 C】班长竞选【SCC缩点】

    题意: 大学班级选班长,n个同学均可以发表意见.若意见为A B,则表示A认为B合适.意见具有传递性,即A认为B合适,B认为C合适,则A也认为C合适.共m条意见,要求出最高票数和候选人名单. 思路: 有 ...

  3. 2019.1.31及以前

    [以前的博客] https://www.luogu.org/blog/lizehon/ NOIP2018游记 [环形DP]Naptime [单调队列]最大子序和 [单调队列] 环路运输 [模板]高斯消 ...

  4. NC207040 丢手绢

    题目 牛客网 思路 用双指针,从第一个小朋友开始一圈圈按顺时针方向遍历,到最后一个小朋友的那圈遍历完结束. 因为题目定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离,所以在计算最远距离时要 ...

  5. 线性代数:矩阵变换图形(三维平移缩放旋转)

    紧接上一篇:http://blog.csdn.net/yinhun2012/article/details/79544205 这篇博文我只是准备对上一篇博文的内容进行扩展,因为上一篇我写完二维xy仿射 ...

  6. 看懂这十步,8岁的小朋友都能理解深度学习

    作者 Jean-Louis Queguine  郭一璞 编译  量子位 出品 | 公众号 QbitAI 在对技术毫无了解的人看来,人工智能是什么? <流浪地球>里的AI语音助手MOSS么? ...

  7. 电脑常见问题_解决PC常见问题 篇二十:垃圾佬手把手教你如何正确缩电脑配置砍预算...

    A.选购标准 缩CPU的重点有两点: 1.目标使用环境和线程数+单核主频的匹配度,操作系统本身会吃掉一些线程,我们对于电脑的使用现在也比较复杂,挂着钉钉打开一堆网页都是最基础的常态,没个四线程+以上主 ...

  8. python turtle绕原点旋转_「加德老师与小朋友们的编程之旅」Python海龟作图(上)

    加德老师寄语: 小朋友们,家长朋友们,大家好! [加德老师与小朋友们的编程之旅]今天迎来第二节课--用python进行海龟作图(上) Python被誉为现今人工智能第一语言,适合9岁以上孩子进行编程入 ...

  9. 【科普】一份 8 岁小朋友都能理解的深度学习入门教程

    作者 Jean-Louis Queguine  郭一璞 编译  量子位 出品 | 公众号 QbitAI 原标题:看懂这十步,8岁的小朋友都能理解深度学习 编辑 / 昱良 <流浪地球>里的A ...

最新文章

  1. Exception in thread main java.lang.Error: 无法解析的编译问题: 方法 main 不能声明为 static;只能在静态类型或顶级类型中才能声明静态方法
  2. Go 学习笔记(45)— Go 标准库之 flag(命令行参数解析)
  3. vsearch2.8.1使用和命令简介——中文帮助文档(免费64位版usearch)
  4. 与大疆并称双雄、估值近百亿的极飞科技,现在是一家什么公司?
  5. 产品生成器---父子产品模型
  6. Qt Creator将QML模块与插件一起使用
  7. PHP大批量正则,php – 正则表达式匹配无限数量的选项
  8. 2013年7月04日_回顾总结
  9. 你为什么高考会考砸?-论出题侧重点其实是故意的
  10. NET问答: 多个 await 和 Task.WaitAll 是等价的吗?
  11. 刚认识女孩说不要浪费时间_不要浪费时间寻找学习数据科学的最佳方法
  12. jQuery是什么,jQuery入门简介
  13. python项目总结与展望_我做知识星球一周年总结与未来展望
  14. python读取csv文件坐标地图描点_python3 通过百度地图API获取城市POI点并存于CSV格式...
  15. java label 加图片吗_UILabel里面加图片
  16. CSS Sprites在IE中不起作用[8/7/6]
  17. 【问题2】如何保证缓存与数据库的双写一致性?
  18. SCRT软件的使用教程
  19. java javac 以及 javaw
  20. 怎样自学编程php语言,如何自学软件编程

热门文章

  1. Animate.css介绍及使用教程
  2. 计算机网络简答题——期末复习系列
  3. U盘分区删除了怎么恢复数据?快来看看吧
  4. 统计机器学习笔记1--AI背景概论,损失函数,风险,,,
  5. 全球及中国身体区域网络行业商业模式分析及投资风险预测2022年版
  6. 按键状态机消抖(上)
  7. firefox os 开发踩地雷游戏源码
  8. 小程序canvas画圆
  9. 【剑指offer-C++】JZ36:二叉搜索树与双向链表
  10. Office365 - OneDrive Sync SharePoint Online Files时显示Site Read Only问题的解决方案