cp-documentation

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

View the Project on GitHub zawa-tin/cp-documentation

:heavy_check_mark: Test/AtCoder/abc350_c.test.cpp

Depends on

Code

#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/1/ITP1_1_A"
// #define PROBLEM "https://atcoder.jp/contests/abc350/tasks/abc350_c"

/*
 * AtCoder Beginner Contest 350 C - Sort
 * https://atcoder.jp/contests/abc350/submissions/64587344
 */

#include "../../Src/Sequence/PermutationSwapSort.hpp"

#include <iostream>
#include <vector>
int N, A[200020];
int main() {
#ifdef ATCODER
    std::cin >> N;
    for (int i = 0 ; i < N ; i++) {
        std::cin >> A[i];
        A[i]--;
    }
    auto ans = zawa::PermutationSwapSort(A, A + N);
    std::cout << ans.size() << '\n';
    for (auto [i, j] : ans) std::cout << i + 1 << ' ' << j + 1 << '\n';
#else
    std::cout << "Hello World\n";
#endif
}
#line 1 "Test/AtCoder/abc350_c.test.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/1/ITP1_1_A"
// #define PROBLEM "https://atcoder.jp/contests/abc350/tasks/abc350_c"

/*
 * AtCoder Beginner Contest 350 C - Sort
 * https://atcoder.jp/contests/abc350/submissions/64587344
 */

#line 2 "Src/Sequence/PermutationSwapSort.hpp"

#include <cassert>
#include <concepts>
#include <iterator>
#include <utility>
#include <vector>

#line 2 "Src/Template/TypeAlias.hpp"

#include <cstdint>
#include <cstddef>

namespace zawa {

using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using i128 = __int128_t;

using u8 = std::uint8_t;
using u16 = std::uint16_t;
using u32 = std::uint32_t;
using u64 = std::uint64_t;

using usize = std::size_t;

} // namespace zawa
#line 10 "Src/Sequence/PermutationSwapSort.hpp"

namespace zawa {

namespace internal {

// Is A permutation of (0,1,...,|A|-1) ?
template <std::integral T>
bool IsPermutation(const std::vector<T>& A) {
    std::vector<bool> app(A.size());
    for (T v : A) {
        if (v < 0 or v >= (T)A.size()) return false;
        if (app[v]) return false;
        app[v] = true;
    }
    return true;
}

} // namespace internal

template <std::input_iterator It>
std::vector<std::pair<usize, usize>> PermutationSwapSort(It first, It last) {
    std::vector P(first, last);
    assert(internal::IsPermutation(P));
    std::vector<std::pair<usize, usize>> res;
    for (usize i = 0 ; i < P.size() ; i++) while ((usize)P[i] != i) {
        res.push_back({i, P[i]});
        std::swap(P[i], P[P[i]]);
    }
    return res;
}

} // namespace zawa
#line 10 "Test/AtCoder/abc350_c.test.cpp"

#include <iostream>
#line 13 "Test/AtCoder/abc350_c.test.cpp"
int N, A[200020];
int main() {
#ifdef ATCODER
    std::cin >> N;
    for (int i = 0 ; i < N ; i++) {
        std::cin >> A[i];
        A[i]--;
    }
    auto ans = zawa::PermutationSwapSort(A, A + N);
    std::cout << ans.size() << '\n';
    for (auto [i, j] : ans) std::cout << i + 1 << ' ' << j + 1 << '\n';
#else
    std::cout << "Hello World\n";
#endif
}
Back to top page