zawatins-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub zawa-tin/zawatins-library

:heavy_check_mark: Cyclic Permutation(巡回置換分解)
(src/algorithm/Cyclic-Permutation.hpp)

概要

std::vector<std::vector<int>> decomp_cyclic_permutation(std::vector<T>& arr)

引数の配列からソート済の列への置換を巡回置換の積で表現します。

機能

使いどころ

計算量

配列の長さを$N$として$O(N)$

Verified with

Code

#pragma once

#include <vector>
#include <algorithm>

namespace zawa {

    template <typename T>
    std::vector<std::vector<int>> decomp_cyclic_permutation(std::vector<T>& arr) {
        std::vector<std::pair<T, int>> cp(arr.size());
        for (int i = 0 ; i < (int)arr.size() ; i++) {
            cp[i] = {arr[i], i};
        }
        sort(cp.begin(), cp.end());

        std::vector<std::vector<int>> res;
        std::vector<int> used(arr.size());
        for (int i = 0 ; i < (int)arr.size() ; i++) {
            if (used[i]) continue;
            std::vector<int> cycle;
            int now = i;
            while(!used[now]) {
                cycle.emplace_back(now);
                used[now] = 1;
                now = cp[now].second;
            }
            res.emplace_back(cycle);
        }

        return res;
    }

}// namespace zawa
#line 2 "src/algorithm/Cyclic-Permutation.hpp"

#include <vector>
#include <algorithm>

namespace zawa {

    template <typename T>
    std::vector<std::vector<int>> decomp_cyclic_permutation(std::vector<T>& arr) {
        std::vector<std::pair<T, int>> cp(arr.size());
        for (int i = 0 ; i < (int)arr.size() ; i++) {
            cp[i] = {arr[i], i};
        }
        sort(cp.begin(), cp.end());

        std::vector<std::vector<int>> res;
        std::vector<int> used(arr.size());
        for (int i = 0 ; i < (int)arr.size() ; i++) {
            if (used[i]) continue;
            std::vector<int> cycle;
            int now = i;
            while(!used[now]) {
                cycle.emplace_back(now);
                used[now] = 1;
                now = cp[now].second;
            }
            res.emplace_back(cycle);
        }

        return res;
    }

}// namespace zawa
Back to top page