首页 > 其他分享 >Permutation Swaps

Permutation Swaps

时间:2025-01-18 17:54:14浏览次数:1  
标签:Swaps int sum ST Permutation 操作 查询 gx

Permutation Swaps

传送门

题目理解

第一个操作:把第i个数移到位置p[i](1<=i<=n)
发现:这个操作其实就是循环移位,有Teleporter的经验在前,此操作可用倍增\(\log_{2}^{n}\)实现,同时可 以推出此操作可以叠加,所以用一个sum记录操作次数,查询时一次解决
第二个操作:交换两个位置,此操作较复杂,详见后文
第三个操作:查询x位置数的值
结论:在不考虑第二个操作的情况下,对sum进行二进制拆分,并用预处理好的\(f_k(u)\)[1]更新x

做法

因为第二个操作需要改变原序列位置,所以改变后直接查询\(f_k\)函数会错,这时,就需要运用逆思想:正着不行,倒着来。
在这里,我们需要用到一个数学结论

\[当f是集合A到集合B的一个满映射时\\ \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;
}

  1. 位置为u的跳2k↩︎

标签:Swaps,int,sum,ST,Permutation,操作,查询,gx
From: https://www.cnblogs.com/keysky/p/18678662

相关文章

  • Codeforces Round 867 (Div. 3)-D. Super-Permutation
    Codeforces题解-[CodeforcesRound867(Div.3)-D.Super-Permutation]题目链接题目描述Apermutationisasequence\(n\)integers,whereeachintegerfrom\(1\)to\(n\)appearsexactlyonce.Forexample,\([1]\),\([3,5,2,1,4]\),\([1,3,2]\)areper......
  • permutations函数和combinations函数使用
    https://www.cnblogs.com/kaka00311/p/16114944.html pythonitertools模块中全排列函数包含combinations函数和permutations函数,简要介绍如下:1、combinations函数函数语法:combinations(iterable,r)连续返回由iterable元素生成长度为r的序列,如果r未指定或为None,r......
  • 题解:AtCoder [ARC176D] Swap Permutation
    题意原题链接给定一个长度为\(n\)的排列\(p\),并执行以下操作\(m\)次:选择\(1\leqi<j\leqn\),交换\(p_i\)和\(p_j\)。定义一个序列\(p\)的权值为\(\sum_{i=1}^{n-1}|p_i-p_{i-1}|\)。求在\(\binom{n}{2}^m\)种可能的操作后,\(p\)的价值之和。答案对\(998244353\)......
  • CF1477D Nezzar and Hidden Permutations 题解
    Description给定一张\(n\)个点\(m\)条边的简单无向图,构造两个排列\(p,q\),使得:对任意\((u,v)\inE\),\((p_u-p_v)(q_u-q_v)>0\).在此基础上,最大化\(\left|\left\{i\|\p_i\neqq_i\right\}\right|\).\(1\leqn,m\leq5\times10^5\)。Solution首先显然如果存在一个......
  • [CF1477D] Nezzar and Hidden Permutations
    一开始看到这道题确实有种无从下手的感觉,具体说一说思考过程容易得出若\(m=\frac{n(n-1)}{2}\),必定排列\(p\)和\(q\)相等,思考若删掉一个限制之后会怎么样。第一步是简单的,发现若删掉\((l,r)\),那么只要\(l\)和\(r\)中的元素是相邻的,那么\(l\)和\(r\)的元素就......
  • AT_agc030_f [AGC030F] Permutation and Minimum 题解
    先去掉相邻两个都填完的位置,对于两个都没填的记个数为\(c\),最后只需要将答案乘上\(c!\)。接下来考虑从小到大枚举所有数进行dp,记\(f_{i,j,k}\)表示考虑完前\(1\simi\),有\(j\)个数需要跟一个位置确定的数匹配,有\(k\)个数需要跟后面一个自由的数匹配,考虑当前的数:如果......
  • 【Basic Abstract Algebra】Exercises for Section 2.4 — Permutation groups
    Computetheinverseof\((465312)\).Solution:Since\((465312)=(42)(41)(43)(45)(46)\),wehave\((465312)^{-1}=(46)(45)(43)(41)(42)=(421356)\).#Let\(G\)beagroupanddefineamap\(\lambda_g:G\toG\)by\(\lambda_g(a)=ga\).Provet......
  • Codeforces Round 992 (Div. 2) C. Ordered Permutations
    给出数字n,构造一个符合的数组很容易想到,n1时,只有1符合。n2时,有12;21符合。n==3时,有123;132;231;321;发现必须分为1和2——n的两块数字,有某种递归的感觉,答案与2次方有关于是做出代码:#include<iostream>#include<algorithm>usingnamespacestd;#defineffp(x,y......
  • 置换与转置 permutations & transposes
    置换与转置permutations&transposes​ 首先说一下置换矩阵(permutationmatrix),通常记为\(\symbfit{P}\),是用来完成行互换操作的矩阵。\(\symbfit{P}_{i,j}\)记为第\(i\)行和第\(j\)行互换的置换矩阵。​ 例如三行三列方阵有\(3!=6\)个置换矩阵,如\(\symbfit{P}_{2,1}=\begin{bm......
  • 【五一省选集训day4】Permutation
    【五一省选集训day4】Permutation每次操作把数分成两组,每组内的顺序不变,把第\(0\)组放到第\(1\)组前面。发现这很像基于二进制的基数排序。假设我们进行\(k\)次这样的操作,就相当于给每个数赋一个值\((x,y)\),其中\(0\lex\le2^k-1,y=\texttt{数的下标}\)。然后对第一维......