Submission #336389

#TimeUsernameProblemLanguageResultExecution timeMemory
336389KoDRemittance (JOI19_remittance)C++17
100 / 100
690 ms60012 KiB
#include <bits/stdc++.h> using i32 = std::int32_t; using i64 = std::int64_t; using u32 = std::uint32_t; using u64 = std::uint64_t; using isize = std::ptrdiff_t; using usize = std::size_t; template <class T> using Vec = std::vector<T>; constexpr i32 inf32 = (u32) ~0 >> 2; constexpr i64 inf64 = (u64) ~0 >> 2; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); usize N; std::cin >> N; Vec<i64> A(N), B(N); for (usize i = 0; i < N; ++i) { std::cin >> A[i] >> B[i]; } Vec<i64> dif(N); for (usize i = 0; i < N; ++i) { const auto j = (i + 1 == N ? 0 : i + 1); dif[i] = B[j] - A[j]; } std::vector<i64> number(N + 30); const auto add = [&](std::vector<i64> &vec, i64 x, const usize shift) { bool neg = (x < 0); x = std::abs(x); for (usize d = 0; d < 30; ++d) { if (x >> d & 1) { vec[shift + d] += (neg ? -1 : 1); } } }; const auto fix = [&](std::vector<i64> &vec) { for (usize i = 0; i + 1 < vec.size(); ++i) { if (vec[i] < 0) { const auto tmp = -vec[i]; vec[i] += tmp * 2; vec[i + 1] -= tmp; } const auto tmp = vec[i] / 2; vec[i] -= tmp * 2; vec[i + 1] += tmp; } }; add(number, -dif[N - 1], 0); for (usize i = 0; i + 1 < N; ++i) { add(number, -dif[i], i + 1); } fix(number); if (number.back() < 0) { std::cout << "No\n"; return 0; } i64 big = 1000000000, small = -1; while (big - small > 1) { const auto md = (big + small) / 2; std::vector<i64> comp(number.size()); add(comp, md, N); add(comp, -md, 0); fix(comp); bool large = true; for (usize i = number.size(); i --> 0;) { if (comp[i] < number[i]) { large = false; break; } if (comp[i] > number[i]) { break; } } (large ? big : small) = md; } Vec<i64> X(N); X[N - 1] = big; for (usize i = N - 1; i --> 0;) { X[i] = dif[i] + 2 * X[i + 1]; if (X[i] < 0) { std::cout << "No\n"; return 0; } } for (usize step = 0; step < 30; ++step) { for (usize i = 0; i < N; ++i) { const auto j = (i + 1 == N ? 0 : i + 1); const auto tmp = std::min(X[i], A[i] / 2); X[i] -= tmp; A[i] -= 2 * tmp; A[j] += tmp; } } for (usize i = 0; i < N; ++i) { if (A[i] != B[i]) { std::cout << "No\n"; return 0; } } std::cout << "Yes\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...