#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 #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 > requires std::strict_weak_order class BinaryHeap { private: Comp m_comp; std::vector m_dat; public: inline usize size() const { return m_dat.size() - 1; } inline bool empty() const { return m_dat.size() == 1; } inline const Comp& comp() const { return m_comp; } using const_iterator = typename decltype(m_dat)::const_iterator; const_iterator begin() const { return m_dat.begin() + 1; } const_iterator end() const { return m_dat.end(); } BinaryHeap(Comp comp = {}) : m_comp{comp}, m_dat(1) {} template requires std::same_as, T> BinaryHeap(It first, It last, Comp comp = {}) : m_comp{comp}, m_dat(1) { m_dat.insert(m_dat.end(), first, last); build(); } BinaryHeap(std::vector&& a, Comp comp = {}) : m_comp{comp}, m_dat(a.size() + 1) { std::ranges::copy(std::make_move_iterator(a.begin()), std::make_move_iterator(a.end()), m_dat.begin() + 1); build(); } BinaryHeap(const std::vector& a, Comp comp = {}) : m_comp{comp}, m_dat(a.size() + 1) { std::ranges::copy(a.begin(), a.end(), m_dat.begin() + 1); build(); } const T& top() const { assert(size() and "HeapUnderFlow"); return m_dat[1]; } void push(T&& v) { m_dat.push_back(std::move(v)); upHeap(size()); } void push(const T& v) { m_dat.push_back(v); upHeap(size()); } void pop() { assert(size() and "HeapUnderFlow"); if (size() > 1) std::swap(m_dat[1], m_dat.back()); m_dat.pop_back(); if (size() > 1) downHeap(1, size()); } private: void build() { const usize n = size(); for (usize i = (n >> 1) ; i ; i--) downHeap(i, n); } void upHeap(usize i) { while (i >> 1 and m_comp(m_dat[i], m_dat[i >> 1])) { std::swap(m_dat[i], m_dat[i >> 1]); i >>= 1; } } void downHeap(usize i, usize n) { while ((i << 1) <= n) { usize j = i << 1; if (j + 1 <= n and m_comp(m_dat[j + 1], m_dat[j])) j++; if (!m_comp(m_dat[j], m_dat[i])) break; std::swap(m_dat[i], m_dat[j]); i = j; } } }; } // 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, M; cin >> N >> M; vector T(N); for (auto& x : T) cin >> x; vector S(M); BinaryHeap> que; for (int i = 0 ; i < M ; i++) que.push({0LL,i}); for (int i : T) { int j = que.top().second; que.pop(); S[j] += i; que.push({S[j],j}); } cout << *ranges::max_element(S) << '\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 }