Permutation Swaps
Permutation Swaps
题目理解
第一个操作:把第i个数移到位置p[i](1<=i<=n)
发现:这个操作其实就是循环移位,有Teleporter的经验在前,此操作可用倍增\(\log_{2}^{n}\)实现,同时可 以推出此操作可以叠加,所以用一个sum记录操作次数,查询时一次解决
第二个操作:交换两个位置,此操作较复杂,详见后文
第三个操作:查询x位置数的值
结论:在不考虑第二个操作的情况下,对sum进行二进制拆分,并用预处理好的\(f_k(u)\)[1]更新x
做法
因为第二个操作需要改变原序列位置,所以改变后直接查询\(f_k\)函数会错,这时,就需要运用逆思想:正着不行,倒着来。
在这里,我们需要用到一个数学结论
\exists B到A的映射g使得g(f(i))=i\\
我们称g是f的反函数
\]
我们对\(p\)处理出它的反函数\(g\),并对其处理倍增ST表,我们可以发现查询\(f_k\)时查询的是位置,所以做第二个操作时,交换的不是 x 和 y ,而是\(ST_k(x)\)和\(ST_k(y)\)。并且因为\(f_k\)查询的是位置,于是我们直接交换这两个值不影响结果。
预处理:对于\(f\)我们可以发现\(f_k(u)=f_{k-x}(f_x(u))\),所以对于\(\forall\)u预处理\(f_{2^b}(u)\)(b<=\(\log_{2}^{n}\)),计算\(f_k(u)\)时,对k进行二进制拆分并更新。例如:对于\(k=13\),可以写成\(13=8+4+1\),于是有\(f_{13}(u)=f_8(f_4(f_1(u)))\)。
最后看实现
code:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, K = 17;
int t, n, a[N], p[N];
int g[N], ST[K + 5][N];
int q, op, sum;
inline void init() {
sum = 0;
for (int i = 1;i <= n;i++) g[p[i]] = i;
for (int i = 1;i <= n;i++) ST[0][i] = g[i];
for (int i = 1;i < K;i++)
for (int j = 1;j <= n;j++)
ST[i][j] = ST[i - 1][ST[i - 1][j]];
}
inline int getback(int x, int k) {
for (int i = K - 1;i >= 0;i--)
if ((k >> i) & 1) x = ST[i][x];
return x;
}
inline void solve() {
if (op == 1) sum++;
if (op == 2) {
int x, y;
scanf("%d%d", &x, &y);
int gx = getback(x, sum), gy = getback(y, sum);
swap(a[gx], a[gy]);
}
if (op == 3) {
int x;
scanf("%d", &x);
int gx = getback(x, sum);
printf("%d\n", a[gx]);
}
}
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 1;i <= n;i++) scanf("%d", &a[i]);
for (int i = 1;i <= n;i++) scanf("%d", &p[i]);
init();
scanf("%d", &q);
while (q--) {
scanf("%d", &op);
solve();
}
}
return 0;
}
位置为u的跳2k次 ︎
Permutation Swaps的更多相关文章
- Swaps in Permutation
Swaps in Permutation You are given a permutation of the numbers 1, 2, ..., n and m pairs of position ...
- Educational Codeforces Round 14 D. Swaps in Permutation 并查集
D. Swaps in Permutation 题目连接: http://www.codeforces.com/contest/691/problem/D Description You are gi ...
- codeforces 691D D. Swaps in Permutation(dfs)
题目链接: D. Swaps in Permutation time limit per test 5 seconds memory limit per test 256 megabytes inpu ...
- CodeForces 691D:Swaps in Permutation(并查集)
http://codeforces.com/contest/691/problem/D D. Swaps in Permutation You are given a permutation of ...
- Codeforces 691D Swaps in Permutation
Time Limit:5000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Status Prac ...
- Educational Codeforces Round 14 D. Swaps in Permutation
题目链接 分析:一些边把各个节点连接成了一颗颗树.因为每棵树上的边可以走任意次,所以不难想出要字典序最大,就是每棵树中数字大的放在树中节点编号比较小的位置. 我用了极为暴力的方法,先dfs每棵树,再用 ...
- codeforces 691D Swaps in Permutation DFS
这个题刚开始我以为是每个交换只能用一次,然后一共m次操作 结果这个题的意思是操作数目不限,每个交换也可以无限次 所以可以交换的两个位置连边,只要两个位置连通,就可以呼唤 然后连通块内排序就好了 #in ...
- Educational Codeforces Round 14 D. Swaps in Permutation (并查集orDFS)
题目链接:http://codeforces.com/problemset/problem/691/D 给你n个数,各不相同,范围是1到n.然后是m行数a和b,表示下标为a的数和下标为b的数可以交换无 ...
- 【搜索】【并查集】Codeforces 691D Swaps in Permutation
题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...
- Educational Codeforces Round 14 D. Swaps in Permutation(并查集)
题目链接:http://codeforces.com/contest/691/problem/D 题意: 题目给出一段序列,和m条关系,你可以无限次互相交换这m条关系 ,问这条序列字典序最大可以为多少 ...
随机推荐
- Air780E如何发送SMS?一文详解!
今天一起来学习使用合宙低功耗4G模组Air780E发送SMS短消息: 一.SMS简介 SMS(短消息服务,ShortMessageService)功能主要用于在蜂窝网络中传输短消息. 在4G网络中 ...
- 结合反射与 XML 实现 Java 编程的动态性
反射是 Java 语言被视为动态或准动态语言的一个关键性质,结合反射和 XML 会帮助我们更快.更方便地实现一些动态代码,从而解决编程中可能遇到的不确定问题.本文将结合反射与 XML 对 Java 编 ...
- PHP之JWT的token登录认证
1.JWT简介 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为 ...
- Linux之密码生成工具pwgen
linux中生成随机字符串,可以使用pwgen 安装) ubuntu: apt-get install pwgen Centos: yum install pwgen 语法及参数) pwgen [ O ...
- PHP开源项目之YOURLS
YOURLS是一个开源的PHP的程序,可以利用它来构建属于自己的URL缩短服务,YOURLS还可以集成到WordPress博客中使用. YOURLS 的主要功能: 公开的(Public 任何人都可以用 ...
- window下cmd显示乱码
前情 最近在维护一些老项目,本地开发环境跑不起来,需要根据cmd中的报错来解决一些环境问题 坑位 在解决环境错误的时候,cmd命令行日志打印出来的是一堆乱码,导致看不清具体是什么错误 Why? cmd ...
- MongoDB备份脚本
#!/bin/bash #backup MongoDB #mongodump命令路径 DUMP=/home/mongodb/bin/mongodump #临时备份目录 OUT_DIR=/home/mo ...
- spring 项目实现带请求链路id的日志记录
我们在做java项目的时候通常需要通过请求日志来排查定位线上问题,在日志比较多而我们又需要查找整个请求的全部日志的时候会比较困难.所以,就需要在日志记录的时候讲同一个请求的关键日志用同一个唯一标识串联 ...
- Advanced .NET Remoting: 第 9 章 3.在 Remoting 中传递额外的运行时信息
Advanced .NET Remoting:第 9 章 3.传递运行时信息 前面使用的接收器 ( Sink ) 是 IClientChannelSinks 与 IServerChannelSinks ...
- 中电金信:The Financial-Grade Digital Infrastructure
01 Product Introduction The Financial-Grade Digital Infrastructure is a digitally-enabled foundati ...