#include #include #include #include #include #include #include #include #include #include // #include "Src/Number/IntegerDivision.hpp" // #include "Src/Utility/BinarySearch.hpp" // #include "Src/Sequence/CompressedSequence.hpp" // #include "Src/Sequence/RunLengthEncoding.hpp" // #include "Src/Algebra/Group/AdditiveGroup.hpp" // #include "Src/DataStructure/FenwickTree/FenwickTree.hpp" // #include "Src/DataStructure/SegmentTree/SegmentTree.hpp" // #include "Src/DataStructure/DisjointSetUnion/DisjointSetUnion.hpp" // #include "Src/DataStructure/Heap/BinaryHeap.hpp" #include #include 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 #include #include namespace zawa { template u64 InversionNumber(InputIterator first, InputIterator last) { assert((usize)std::distance(first, last) >= usize{0}); std::vector> A(first, last); auto rec{[&](auto rec, usize L, usize R) -> u64 { if (R - L <= usize{1}) return 0; usize M{(L + R) >> 1}; u64 res{rec(rec, L, M) + rec(rec, M, R)}; std::vector tmp(R - L); usize i{L}, j{M}, k{}; while (i < M and j < R) { if (A[i] <= A[j]) { tmp[k++] = A[i++]; } else { res += M - i; tmp[k++] = A[j++]; } } while (i < M) tmp[k++] = A[i++]; while (j < R) tmp[k++] = A[j++]; for (usize l{L} ; l < R ; l++) { A[l] = tmp[l - L]; } return res; }}; return rec(rec, usize{0}, usize{A.size()}); } template bool InversionParity(InputIterator first, InputIterator last) { assert((usize)std::distance(first, last) >= usize{0}); std::vector> A(first, last); auto rec{[&](auto rec, usize L, usize R) -> bool { if (R - L <= usize{1}) return 0; usize M{(L + R) >> 1}; bool res{rec(rec, L, M) != rec(rec, M, R)}; std::vector tmp(R - L); usize i{L}, j{M}, k{}; while (i < M and j < R) { if (A[i] <= A[j]) { tmp[k++] = A[i++]; } else { res ^= (M - i) & 1; tmp[k++] = A[j++]; } } while (i < M) tmp[k++] = A[i++]; while (j < R) tmp[k++] = A[j++]; for (usize l{L} ; l < R ; l++) { A[l] = tmp[l - L]; } return res; }}; return rec(rec, usize{0}, usize{A.size()}); } } // namespace zawa namespace zawa {} using namespace zawa; // #include "atcoder/modint" // using mint = atcoder::modint998244353; // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") using namespace std; template ostream& operator<<(ostream& os, const pair& p) { os << '(' << p.first << ',' << p.second << ')'; return os; } template ostream& operator<<(ostream& os, const vector& v) { for (int i = 0 ; i < ssize(v) ; i++) os << v[i] << (i + 1 == ssize(v) ? "" : " "); return os; } int main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); cout << fixed << setprecision(20); #if !defined DEBUG int N; cin >> N; vector A(N); for (auto& x : A) cin >> x; cout << InversionNumber(A.begin(),A.end()) << '\n'; #else mt19937_64 mt{random_device{}()}; for (int testcase = 0 ; ; ) { cerr << "----------" << ++testcase << "----------" << endl; auto a = solve(), b = naive(); if (a != b) { // print testcase cerr << "you: " << a << endl; cout << "correct: " << b << endl; exit(0); } } #endif }