hihocoder1330 数组重排

Posted 2855669158

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihocoder1330 数组重排相关的知识,希望对你有一定的参考价值。

题意:一个数组,每次把i位置的数移到pi位置,问要几次可以将数组重新排列回来

题解:计算每个数的周期,所有数的周期的lcm就是答案,复杂度O(n*n),一个循环里面的数周期都是一样的,标记一下,复杂度o(n)

#include <bits/stdc++.h>
#define maxn 110
#define ll long long
using namespace std;
ll a[maxn], dir[maxn];
map<ll,ll>mp;
int main(){
    ll n, t, num=0, ans=1;
    scanf("%lld", &n);
    for(ll i=1;i<=n;i++) scanf("%lld", &a[i]);
    for(ll i=1;i<=n;i++){
        num = 0;t = a[i];
        if(dir[t] == 1) continue;
        mp.clear();
        while(!mp[t]){
            mp[t] = 1;
            t = a[t];
            dir[t] = 1;
            num++;
        }
        ans = ans*num/__gcd(ans, num);
    }
    printf("%lld\n", ans);
    return 0;
}

 

以上是关于hihocoder1330 数组重排的主要内容,如果未能解决你的问题,请参考以下文章

hihoCoder 数组重排

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段

hihocoder第233周

hihocoder-1327-分割字符串--贪心

poj1330 Nearest Common Ancestors

HIHOcoder 1403 后缀数组一·重复旋律