제출 #262843

#제출 시각아이디문제언어결과실행 시간메모리
262843KoDFireworks (APIO16_fireworks)C++11
55 / 100
67 ms49144 KiB
/** * @title Template */ #include <iostream> #include <algorithm> #include <utility> #include <numeric> #include <vector> #include <array> #include <cassert> #include <iomanip> template <class T, class U> bool chmin(T &lhs, const U &rhs) { if (lhs > rhs) { lhs = rhs; return true; } return false; } template <class T, class U> bool chmax(T &lhs, const U &rhs) { if (lhs < rhs) { lhs = rhs; return true; } return false; } /** * @title Chmin/Chmax */ class range { public: class iterator { private: int64_t M_position; public: iterator(int64_t position) noexcept: M_position(position) { } void operator ++ () noexcept { ++M_position; } bool operator != (iterator other) const noexcept { return M_position != other.M_position; } int64_t operator * () const noexcept { return M_position; } }; class reverse_iterator { private: int64_t M_position; public: reverse_iterator(int64_t position) noexcept: M_position(position) { } void operator ++ () noexcept { --M_position; } bool operator != (reverse_iterator other) const noexcept { return M_position != other.M_position; } int64_t operator * () const noexcept { return M_position; } }; private: const iterator M_first, M_last; public: range(int64_t first, int64_t last) noexcept: M_first(first), M_last(std::max(first, last)) { } iterator begin() const noexcept { return M_first; } iterator end() const noexcept { return M_last; } reverse_iterator rbegin() const noexcept { return reverse_iterator(*M_last - 1); } reverse_iterator rend() const noexcept { return reverse_iterator(*M_first - 1); } }; /** * @title Range */ #include <type_traits> #include <iterator> template <class T> class rev_impl { public: using iterator = decltype(std::declval<T>().rbegin()); private: const iterator M_begin; const iterator M_end; public: rev_impl(T &&cont) noexcept: M_begin(cont.rbegin()), M_end(cont.rend()) { } iterator begin() const noexcept { return M_begin; } iterator end() const noexcept { return M_end; } }; template <class T> rev_impl<T> rev(T &&cont) { return rev_impl<T>(std::forward<T>(cont)); } /** * @title Reverser */ using i32 = int32_t; using i64 = int64_t; using u32 = uint32_t; using u64 = uint64_t; constexpr i32 inf32 = (i32(1) << 30) - 1; constexpr i64 inf64 = (i64(1) << 62) - 1; constexpr size_t MAX = 5000; i32 N, M, V; std::array<i32, MAX> P, C; struct status { i64 x, inc; }; std::array<std::vector<status>, MAX> data; std::array<std::vector<i32>, MAX> child; void dfs(const i32 u) { if (u >= N) { data[u].push_back(status{ 0, -1 }); data[u].push_back(status{ C[u], 2 }); return; } for (auto v: child[u]) { dfs(v); const auto cur = data[u].size(); data[u].resize(cur + data[v].size()); std::copy(data[v].begin(), data[v].end(), data[u].begin() + cur); std::inplace_merge(data[u].begin(), data[u].begin() + cur, data[u].end(), [](status s, status t) { return s.x < t.x; }); } std::vector<status> next; i64 sum = 0; for (auto i: range(0, data[u].size())) { sum += data[u][i].inc; if (i + 1 == data[u].size() || data[u][i + 1].x != data[u][i].x) { next.push_back(status{ data[u][i].x, sum }); sum = 0; } } data[u].swap(next); if (C[u] == 0) { return; } next.clear(); next.push_back(data[u][0]); sum = data[u][0].inc; for (auto i: range(1, data[u].size())) { if (sum + data[u][i].inc == 0) { if (-1 - sum != 0) next.push_back(status{ data[u][i].x, -1 - sum }); next.push_back(status{ data[u][i].x + C[u], 1 }); next.push_back(status{ data[u][i + 1].x + C[u], 1 }); break; } if (sum + data[u][i].inc > 0) { if (-1 - sum != 0) next.push_back(status{ data[u][i].x, -1 - sum }); next.push_back(status{ data[u][i].x + C[u], 2 }); break; } sum += data[u][i].inc; next.push_back(data[u][i]); } data[u] = std::move(next); } int main() { std::cin >> N >> M; V = N + M; P[0] = -1; for (auto i: range(1, V)) { std::cin >> P[i] >> C[i]; --P[i]; child[P[i]].push_back(i); } dfs(0); i64 sum = 0; for (auto i: range(1, V)) { sum += C[i]; } i64 slope = data[0][0].inc; i64 last = 0; for (auto i: range(1, data[0].size())) { sum += slope * (data[0][i].x - last); slope += data[0][i].inc; last = data[0][i].x; if (slope >= 0) { break; } } std::cout << sum << '\n'; return 0; }

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

fireworks.cpp: In function 'void dfs(i32)':
fireworks.cpp:148:15: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<status>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |     if (i + 1 == data[u].size() || data[u][i + 1].x != data[u][i].x) {
      |         ~~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...