제출 #624852

#제출 시각아이디문제언어결과실행 시간메모리
624852dutinmeowCake 3 (JOI19_cake3)C++17
100 / 100
757 ms119340 KiB
#include <bits/stdc++.h> using namespace std; #pragma region zip #ifndef ZIP_HPP #define ZIP_HPP namespace zip_internal { template<typename Iter> using select_access_type_for = conditional_t< is_same_v<Iter, vector<bool>::iterator> || is_same_v<Iter, vector<bool>::const_iterator>, typename Iter::value_type, typename Iter::reference >; template<typename ...Args, size_t ...Index> auto any_match_impl(tuple<Args...> const & lhs, tuple<Args...> const & rhs, index_sequence<Index...>) -> bool { auto result = false; result = (... | (get<Index>(lhs) == get<Index>(rhs))); return result; } template<typename ...Args> auto any_match(tuple<Args...> const &lhs, tuple<Args...> const &rhs) -> bool { return any_match_impl(lhs, rhs, index_sequence_for<Args...>{}); } template<typename ... Iters> class zip_iterator { public: using value_type = tuple<select_access_type_for<Iters>...>; zip_iterator() = delete; zip_iterator(Iters &&...iters) : m_iters {forward<Iters>(iters)...} {} auto operator++() -> zip_iterator &{ apply([](auto && ... args) { ((args += 1), ...); }, m_iters); return *this; } auto operator++(int) -> zip_iterator { auto tmp = *this; ++*this; return tmp; } auto operator!=(zip_iterator const &other) { return !(*this == other); } auto operator==(zip_iterator const &other) { auto result = false; return any_match(m_iters, other.m_iters); } auto operator*() -> value_type { return apply([](auto && ... args) { return value_type(*args...); }, m_iters); } private: tuple<Iters...> m_iters; }; template<typename T> using select_iterator_for = conditional_t< is_const_v<remove_reference_t<T>>, typename decay_t<T>::const_iterator, typename decay_t<T>::iterator >; template<typename ...T> class zipper { public: using zip_type = zip_iterator<select_iterator_for<T>...>; template<typename ...Args> zipper(Args && ... args) : m_args{forward<Args>(args)...} {} auto begin() -> zip_type { return apply([](auto &&...args){ return zip_type(std::begin(args)...); }, m_args); } auto end() -> zip_type { return apply([](auto && ... args) { return zip_type(std::end(args)...); }, m_args); } private: tuple<T...> m_args; }; } template<typename ...T> auto zip(T &&...t) { return zip_internal::zipper<T ...>{forward<T>(t)...}; } #endif #pragma endregion zip #pragma region y_combinator #ifndef Y_COMBINATOR_HPP #define Y_COMBINATOR_HPP template<class Fun> class y_combinator_result { Fun fun_; public: template<class T> explicit y_combinator_result(T &&fun) : fun_(std::forward<T>(fun)) {} template<class ...Args> decltype(auto) operator()(Args &&...args) { return fun_(std::ref(*this), std::forward<Args>(args)...); } }; template<class Fun> decltype(auto) y_combinator(Fun &&fun) { return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun)); } #endif #pragma endregion y_combinator #pragma region chmax #ifndef CHMAX_HPP #define CHMAX_HPP template<typename T> bool chmax(T &a, T b) { if (a < b) { a = b; return true; } return false; } #endif #pragma endregion chmax class wavelet_tree { int n; vector<long long> vmap; vector<vector<int>> tree; vector<vector<long long>> psum; template<typename I> void build(I begin, I end, int t, int vl, int vr) { if (vl == vr) { int nn = end - begin + 1; psum[t].reserve(nn); psum[t].push_back(0); for (auto it = begin; it != end; it++) psum[t].push_back(psum[t].back() + vmap[*it]); return; } int vm = (vl + vr) / 2, nn = end - begin + 1; tree[t].reserve(nn); psum[t].reserve(nn); tree[t].push_back(0); psum[t].push_back(0); for (auto it = begin; it != end; it++) { tree[t].push_back(tree[t].back() + (*it <= vm)); psum[t].push_back(psum[t].back() + vmap[*it]); } auto pivot = stable_partition(begin, end, [vm](int x) { return x <= vm; }); build(begin, pivot, t * 2, vl, vm); build(pivot, end, t * 2 + 1, vm + 1, vr); } long long query(int l, int r, int k, int t, int vl, int vr) { if (vl == vr) return k * vmap[vl]; int vm = (vl + vr) / 2, lv = tree[t][r] - tree[t][l - 1]; if (k <= lv) return query(tree[t][l - 1] + 1, tree[t][r], k, t * 2, vl, vm); else return psum[t * 2][tree[t][r]] - psum[t * 2][tree[t][l - 1]] +\ query(l - tree[t][l - 1], r - tree[t][r], k - lv, t * 2 + 1, vm + 1, vr); } public: wavelet_tree(vector<long long> vec) { init(vec.begin(), vec.end()); } template<typename I> void init(I begin, I end) { map<long long, int> m; for (auto it = begin; it != end; it++) m[*it] = 0; n = 0; vmap.resize(m.size()); for (auto &[k, v] : m) vmap[v = n++] = k; for (auto it = begin; it != end; it++) *it = m[*it]; tree.resize(4 * n); psum.resize(4 * n); build(begin, end, 1, 0, n); } // returns sum of k smallest elements in range [l, r] long long query(int l, int r, int k) { assert(k <= r - l + 1); return query(l + 1, r + 1, k, 1, 0, n); } }; int main() { int N, M; cin >> N >> M; vector<pair<long long, long long>> A(N); for (auto &[v, c] : A) { cin >> v >> c; v = -v; } sort(A.begin(), A.end(), [](auto a, auto b) { return a.second < b.second; }); vector<long long> V(N), C(N); for (auto &&[a, v, c] : zip(A, V, C)) tie(v, c) = a; wavelet_tree wt(V); vector<int> rpos(N - M + 1); auto dnq = y_combinator([&](auto dnq, int pl, int pr, int ql, int qr) -> void { if (pr < pl) return; if (ql == qr) { for (int i = pl; i <= pr; i++) rpos[i] = ql; return; } int pm = (pl + pr) / 2, qm = -1; long long val = LLONG_MIN; for (int i = ql; i <= qr; i++) { if (i - pm + 1 < M) continue; long long cur = -wt.query(pm, i, M) - 2 * (C[i] - C[pm]); if (chmax(val, cur)) qm = i; } rpos[pm] = qm; dnq(pl, pm - 1, ql, qm); dnq(pm + 1, pr, qm, qr); }); dnq(0, N - M, M - 1, N - 1); long long ans = LLONG_MIN; for (int l = 0; l < N - M + 1; l++) { int r = rpos[l]; long long val = (r == -1 ? -1 : -wt.query(l, r, M) - 2 * (C[r] - C[l])); chmax(ans, val); } cout << ans << '\n'; }

컴파일 시 표준 에러 (stderr) 메시지

cake3.cpp:4: warning: ignoring '#pragma region zip' [-Wunknown-pragmas]
    4 | #pragma region zip
      | 
cake3.cpp:100: warning: ignoring '#pragma endregion zip' [-Wunknown-pragmas]
  100 | #pragma endregion zip
      | 
cake3.cpp:102: warning: ignoring '#pragma region y_combinator' [-Wunknown-pragmas]
  102 | #pragma region y_combinator
      | 
cake3.cpp:127: warning: ignoring '#pragma endregion y_combinator' [-Wunknown-pragmas]
  127 | #pragma endregion y_combinator
      | 
cake3.cpp:129: warning: ignoring '#pragma region chmax' [-Wunknown-pragmas]
  129 | #pragma region chmax
      | 
cake3.cpp:145: warning: ignoring '#pragma endregion chmax' [-Wunknown-pragmas]
  145 | #pragma endregion chmax
      | 
cake3.cpp: In instantiation of 'auto zip_internal::zip_iterator<Iters>::operator==(const zip_internal::zip_iterator<Iters>&) [with Iters = {__gnu_cxx::__normal_iterator<std::pair<long long int, long long int>*, std::vector<std::pair<long long int, long long int>, std::allocator<std::pair<long long int, long long int> > > >, __gnu_cxx::__normal_iterator<long long int*, std::vector<long long int, std::allocator<long long int> > >, __gnu_cxx::__normal_iterator<long long int*, std::vector<long long int, std::allocator<long long int> > >}]':
cake3.cpp:51:19:   required from 'auto zip_internal::zip_iterator<Iters>::operator!=(const zip_internal::zip_iterator<Iters>&) [with Iters = {__gnu_cxx::__normal_iterator<std::pair<long long int, long long int>*, std::vector<std::pair<long long int, long long int>, std::allocator<std::pair<long long int, long long int> > > >, __gnu_cxx::__normal_iterator<long long int*, std::vector<long long int, std::allocator<long long int> > >, __gnu_cxx::__normal_iterator<long long int*, std::vector<long long int, std::allocator<long long int> > >}]'
cake3.cpp:227:37:   required from here
cake3.cpp:55:9: warning: unused variable 'result' [-Wunused-variable]
   55 |    auto result = false;
      |         ^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...