正解:矩阵快速幂/tarjan+倍增

解题报告:

传送门!

跟着神仙做神仙题系列III

这题首先一看到就会想到快速幂趴?就会jio得,哦也不是很难哦

然而,看下数据范围,,,1×105,,,显然开不下TT

所以考虑优化快速幂(或找环+倍增

两种方法都港下趴

先说图论好辣QwQ

大概是这样的:

首先我们把每个座位都抽象成一个点,由它给我的A[]可以知道坐在每个座位上的人会移到哪儿

我们就可以理解为连了一条边

显然的是我们可以换了很多次之后换回来,于是就成了一个环了

然后我们就求一波强连通分量,这样我们读入k之后就能先给他取个膜让k控制在一定范围内嘛

然后之后再用下倍增的思想,这个我jio得还是挺好懂的?就是f[i][j]表示i这个点移动2<<j之后会去哪儿

然后就好辣!

get?

快速幂其实也不难,尝试理解一下就能get

这个实在没什么好说的大概扯下趴,,,

这样的,显然它是满足结合律的,举个eg,假如我要挪21次

那我可以一次一次挪,但这显然比较慢,但我也可以这样子:21=24+22+21

所以就用和快速幂一样的思想,这么想吼,一样是有个tmp有个ans

首先20系数是0,所以ans不变,tmp变成A[tmp]

然后21系数是1,所以ans变成A[tmp],tmp变成A[tmp]

然后22系数是1,所以ans变成A[tmp],tmp变成A[tmp]

然后23系数是0,所以ans不变,tmp变成A[tmp]

然后24系数是1,所以ans变成A[tmp],tmp变成A[tmp]

这个我jio得还是可以理解的趴?挺显然的?

实在无法理解可以结合一下前面的倍增,其实这个和倍增是一样的不过倍增是预处理就成立逆推而这个是顺推而已(所以倍增会快一些,不过这个简单打一些啊QwQ

(话说这题我jio得就是单纯的快速幂啊,,,哪里是矩阵快速幂了,,,为什么我看到的两篇都是说是矩阵快速幂啊,,,没有get?

顺便一提,这题的法二有个很新颖的名词"群",似乎用那个更好解释

然而我还没学:D基础都没落实完的菜菜灵巧不配学新芝士呜呜呜

所以详见hl的博客

over!

然后两个方法的代码应该都会打的到时候都放上来QwQ

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rg register
#define rp(i,x,y) for(register ll i=x;i<=y;++i) const ll N=;
ll n,k,a[N],nw[N],tmp[N]; ll read()
{
rg char ch=getchar();rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
} int main()
{
n=read();k=read();rp(i,,n)a[i]=read(),nw[i]=i,tmp[i]=i;
while(k)
{
if(k&){rp(i,,n)tmp[i]=nw[a[i]];rp(i,,n)nw[i]=tmp[i];}
rp(i,,n)tmp[i]=a[a[i]];rp(i,,n)a[i]=tmp[i];k>>=;
}
rp(i,,n)tmp[nw[i]]=i;
rp(i,,n)printf("%lld ",tmp[i]);
return ;
}

这是法二滴代码QwQ

洛谷P5151 HKE与他的小朋友 快速幂/图论+倍增的更多相关文章

  1. 洛谷 P1045 【麦森数】快速幂

    不用快速幂,压位出奇迹! 本人是个蒟蒻,不太熟悉快速幂,这里给大家介绍一种压位大法. 让我们来分析一下题目,第一位是送分的,有一个专门求位数的函数:n*log10(2)+1. 然后题目中p<=3 ...

  2. 洛谷P1357 花园(状态压缩 + 矩阵快速幂加速递推)

    题目链接:传送门 题目: 题目描述 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(<=N<=^).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻 ...

  3. 模板【洛谷P3390】 【模板】矩阵快速幂

    P3390 [模板]矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 矩阵A的大小为n×m,B的大小为n×k,设C=A×B 则\(C_{i,j}=\sum\limits_{k=1}^{n}A_{i, ...

  4. 洛谷P1397 [NOI2013]矩阵游戏(十进制矩阵快速幂)

    题意 题目链接 Sol 感觉做这题只要对矩阵乘法理解的稍微一点就能做出来对于每一行构造一个矩阵A = a 1      0 b列与列之间的矩阵为B = c 1      0 d最终答案为$A^{n - ...

  5. 洛谷 P6772 - [NOI2020]美食家(广义矩阵快速幂)

    题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,第 \(0\) 天的时候你在 \(1\) 号城市,第 \(T\) 天的时候你要回到 \(1\) 号城市. 每条边上的边权表示从城 ...

  6. 【题解】P5151 HKE与他的小朋友

    [题解]P5151 HKE与他的小朋友 实际上,位置的关系可以看做一组递推式,\(f(a_i)=f(a_j),f(a_j)=f(a_t),etc...\)那么我们可以压进一个矩阵里面. 考虑到这个矩阵 ...

  7. 洛谷P2633 Count on a tree(主席树,倍增LCA)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  8. 洛谷P2633 Count on a tree(主席树,倍增LCA,树上差分)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  9. luogu P5151 HKE与他的小朋友

    嘟嘟嘟 看到\(i\)变成了\(A_i\),我突然想起了置换这个东西.于是马上到网上学了一遍轮换乘法. 手模后发现轮换乘法满足结合律,但不满足交换律. 于是就可以快速幂啦. 需要注意的是每一次相乘是\ ...

随机推荐

  1. ScreenPointToRay - 近视口到屏幕的射线

    正如题目所说,ScreenPointToRay可以计算从Camera的近视口nearClip向前发射一条射线到屏幕上的点的坐标. 函数原型为: public Ray ScreenPointToRay( ...

  2. 【Java面试题】3 Java的"=="和equals方法究竟有什么区别?简单解释,很清楚

    ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符. 如果一个变量指向的数据是对象类型的 ...

  3. php如何解决多线程同时读写一个文件的问题

    <?php header("content-type:text/html;charset=utf-8"); $fp = fopen("lock.txt", ...

  4. WAMP环境下配置虚拟主机

    1.编辑httpd.conf,查找#Include conf/extra/httpd-vhosts.conf,把前面注释符号“#”删掉 2.编辑httpd-vhosts.conf文件, <Vir ...

  5. VCL 中的 Windows API 函数(6): BeginDeferWindowPos

    BeginDeferWindowPos 和 DeferWindowPos.EndDeferWindowPos 是一组一起使用的函数, 可对一组窗口的位置.大小.Z 序等进行调整, 在 ExtCtrls ...

  6. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)

    在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只 ...

  7. C#设计模式系列:抽象工厂模式(AbstractFactory)

    出自:http://www.cnblogs.com/libingql/archive/2012/12/09/2809754.html 1. 抽象工厂模式简介 1.1 定义 抽象工厂(Abstract ...

  8. Win7,Win8安装ArcGIS软件或Node.js等安装包出现2503错误的解决方法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZXNyaWNoaW5hY2Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. 怎样设置table中td的高度为1px

    在制作edm时会遇到须要设置td的高度为1px,假设td标签中有 时不管你怎么设置td的高度都没用,最小高度都是18px. 这时须要把表格中的 去掉.例: 原来是这种: <tr> < ...

  10. python计算时间差的方法

    本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: 1.问题: 给定你两个日期,如何计算这两个日期之间间隔几天,几个星期,几个月,几年? 2.解决方法: 标准模块date ...