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条关系 ,问这条序列字典序最大可以为多少 ...
随机推荐
- 基于YOLO实现滑块验证码破解
申明:本案例中的思路和技术仅用于学习交流.请勿用于非法行为. 一.训练模型 详细训练步骤和导出模型参考 滑块验证码识别模型训练 二.模型试用 通过YoloDotNet运行模型,计算出滑块缺口位置后用R ...
- 干货分享:Air780E开发板如何使用?
一.概述 CORE-AIR780E 开发板是合宙通信推出的基于 Air780E 模组所开发的,包含电源,SIM 卡,USB,天线,音频等必要功能的最小硬件系统.以方便用户在设计前期对 Air780 ...
- 移动端自动化之uiautomator2
github: https://github.com/openatx/uiautomator2 [安装] pip3 install -U uiautomator2# 安装UI Inspector -- ...
- Kafka可视化工具之Kafka Tool
官网: https://www.kafkatool.com/download.html Kafka Tool是一个用于管理和使用Apache Kafka集群的GUI应用程序. Kafka Tool提供 ...
- 探索 TypeScript 编程的利器:ts-morph 入门与实践
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:贝儿 背景 在开发 web IDE 中生成代码大纲的功能时 ...
- Business Object 开发
一 什么是BO BO(Business Object),封装在数据库之上,用于直接操作数据(增.删.改.查) 针对不同的BO,在安装目录下有对应的DLL文件,其中封装了BO各式针对具体的业务的方法, ...
- C# Redis 的基本使用
C# Redis 的基本使用 -迷恋自留地 Redis 概述 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一 ...
- uni-app在微信小程序端自定义组件中样式穿透失效
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app. 坑位 最近因UI有别 ...
- 时代新宠儿——HEIF图像格式:节省50%空间
HEIF全称High Efficiency Image File Format(高效图像文件格式),是一种高效的图片封装格式,文件名通常为.heif或者.heic后缀.HEIF能够在保持画质不变的前提 ...
- git 基础操作 && 在"develop"分支修改动但不想提交切换到"master"分支(最后)
测试学习准备条件:一个目录,含不含有文件都可以,创建一个test.txt 1. 创建空仓库 git init 2. 修改过后,添加到本地仓库 添加指定的文件,如果一个以上,文件名空格隔开 git ad ...