Submission #35998383


Source Code Expand

// #define MULTI_TESTCASES
// #define NDEBUG

// Utility
#include <algorithm>
#include <chrono>
#include <functional>
#include <iterator>
#include <limits>
#include <memory>
#include <numeric>
#include <random>
#include <type_traits>

// I/O
#include <fstream>
#include <iomanip>
#include <iostream>
#include <sstream>

// Data Structure
#include <array>
#include <bitset>
#include <deque>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <valarray>
#include <vector>

// Other Types
#include <complex>
#include <optional>
#include <tuple>
#include <utility>
#include <variant>

// C
#include <cassert>
#include <cmath>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

namespace kod {
namespace util {

template <class F> class FixedPoint : private F {
    constexpr FixedPoint(F&& f) : F(std::forward<F>(f)) {}
    template <class G> friend constexpr decltype(auto) fixed(G&&);

  public:
    template <class... Args> constexpr decltype(auto) operator()(Args&&... args) const {
        return F::operator()(*this, std::forward<Args>(args)...);
    }
};

template <class G> [[nodiscard]] constexpr decltype(auto) fixed(G&& g) {
    using F = std::decay_t<G>;
    return FixedPoint<F>(std::forward<F>(g));
}

}  // namespace util
}  // namespace kod

namespace kod {
namespace util {

struct Int1 {};
struct Chars {};

namespace io_impl {

template <class T> struct InputTypeImpl { using Type = T; };
template <> struct InputTypeImpl<Int1> { using Type = int; };
template <> struct InputTypeImpl<Chars> { using Type = std::vector<char>; };

template <class T> using InputType = typename InputTypeImpl<T>::Type;

}  // namespace io_impl

template <class T> io_impl::InputType<T> scan(std::istream& is) {
    T x;
    is >> x;
    return x;
}

template <> int scan<Int1>(std::istream& is) {
    int x;
    is >> x;
    return x - 1;
}

template <> std::vector<char> scan<Chars>(std::istream& is) {
    std::string s;
    is >> s;
    return std::vector<char>(std::cbegin(s), std::cend(s));
}

template <class T, int N> std::array<io_impl::InputType<T>, N> scan_arr(std::istream& is) {
    std::array<io_impl::InputType<T>, N> a;
    for (auto& x : a) x = scan<T>(is);
    return a;
}

template <class T> std::vector<io_impl::InputType<T>> scan_vec(std::istream& is, int n) {
    if (n == -1) n = scan<int>(is);
    assert(n >= 0);
    std::vector<io_impl::InputType<T>> v;
    v.reserve(n);
    while (n--) v.push_back(scan<T>(is));
    return v;
}

template <class T> io_impl::InputType<T> scan() {
    return scan<T>(std::cin);
}

template <class T, int N> std::array<io_impl::InputType<T>, N> scan_arr() {
    return scan_arr<T, N>(std::cin);
}

template <class T> std::vector<io_impl::InputType<T>> scan_vec(int n) {
    return scan_vec<T>(std::cin, n);
}

void print(std::ostream&) {}

template <class T, class... Args> void print(std::ostream& os, T&& x, Args&&... args) {
    os << x;
    if (sizeof...(args) != 0) os << ' ';
    print(os, std::forward<Args>(args)...);
}

template <class... Args> void println(std::ostream& os, Args&&... args) {
    print(os, std::forward<Args>(args)...);
    os << '\n';
}

template <class C>
void print_seq(std::ostream& os, C&& c, const char* sep = " ", const char* end = "\n") {
    bool f = false;
    for (auto&& x : c) {
        if (f) {
            os << sep;
        } else {
            f = true;
        }
        os << x;
    }
    os << end;
}

template <class... Args> void print(Args&&... args) {
    print(std::cout, std::forward<Args>(args)...);
}

template <class... Args> void println(Args&&... args) {
    println(std::cout, std::forward<Args>(args)...);
}

template <class C> void print_seq(C&& c, const char* sep = " ", const char* end = "\n") {
    print_seq(std::cout, std::forward<C>(c), sep, end);
}

}  // namespace util
}  // namespace kod

namespace kod {
namespace util {

class ForwardLoop {
    int src, dst;

    constexpr ForwardLoop(const int x, const int y) : src(x), dst(y) {}
    friend constexpr ForwardLoop rep(const int, const int);
    friend constexpr ForwardLoop rep(const int);

  public:
    constexpr ForwardLoop begin() const { return *this; }
    constexpr std::monostate end() const { return {}; }
    constexpr bool operator!=(std::monostate) const { return src < dst; }
    constexpr void operator++() const {}
    constexpr int operator*() { return src++; }
};

[[nodiscard]] constexpr ForwardLoop rep(const int l, const int r) {
    return ForwardLoop(l, r);
}
[[nodiscard]] constexpr ForwardLoop rep(const int n) {
    return ForwardLoop(0, n);
}

class BackwardLoop {
    int src, dst;

    constexpr BackwardLoop(const int x, const int y) : src(x), dst(y) {}
    friend constexpr BackwardLoop revrep(const int, const int);
    friend constexpr BackwardLoop revrep(const int);

  public:
    constexpr BackwardLoop begin() const { return *this; }
    constexpr std::monostate end() const { return {}; }
    constexpr bool operator!=(std::monostate) const { return src > dst; }
    constexpr void operator++() const {}
    constexpr int operator*() { return --src; }
};

[[nodiscard]] constexpr BackwardLoop revrep(const int l, const int r) {
    return BackwardLoop(r, l);
}
[[nodiscard]] constexpr BackwardLoop revrep(const int n) {
    return BackwardLoop(n, 0);
}

template <class F> constexpr void repeat(int n, const F& f) {
    assert(n >= 0);
    while (n--) f();
}

}  // namespace util
}  // namespace kod

namespace kod {
namespace util {

namespace nd_seq_impl {

template <class T, int N, std::enable_if_t<(N != 0)>* = nullptr> struct NdVectorImpl {
    using type = std::vector<typename NdVectorImpl<T, N - 1>::type>;
};
template <class T> struct NdVectorImpl<T, 1> { using type = std::vector<T>; };

template <class T, int N, int... Seq> struct NdArrayImpl {
    using type = std::array<typename NdArrayImpl<T, Seq...>::type, N>;
};
template <class T, int N> struct NdArrayImpl<T, N> { using type = std::array<T, N>; };

struct IsRangeImpl {
    template <class T>
    static auto check(T&& obj) -> decltype(std::begin(obj), std::end(obj), std::true_type{});
    template <class T> static auto check(...) -> std::false_type;
};

template <class T>
constexpr bool is_range_v = decltype(IsRangeImpl::check<T>(std::declval<T>()))::value;
template <class T>
constexpr bool has_range_v =
    is_range_v<T>&& is_range_v<decltype(*std::begin(std::declval<T>()))>;

}  // namespace nd_seq_impl

template <class T, int N> using NdVector = typename nd_seq_impl::NdVectorImpl<T, N>::type;

template <class T> decltype(auto) nd_vec(const int size, T&& value) {
    using U = std::decay_t<T>;
    return std::vector<U>(size, std::forward<U>(value));
}

template <class... Args> decltype(auto) nd_vec(const int size, Args&&... args) {
    assert(size >= 0);
    return std::vector<decltype(nd_vec(std::forward<Args>(args)...))>(
        size, nd_vec(std::forward<Args>(args)...));
}

template <class T, int N, int... Seq>
using NdArray = typename nd_seq_impl::NdArrayImpl<T, N, Seq...>::type;

template <class R, class T, std::enable_if_t<nd_seq_impl::has_range_v<R>>* = nullptr>
constexpr void fill(R&& range, T&& value) {
    for (auto&& e : range) fill(std::forward<decltype(e)>(e), std::forward<T>(value));
}
template <class R, class T, std::enable_if_t<!nd_seq_impl::has_range_v<R>>* = nullptr>
constexpr void fill(R&& range, T&& value) {
    std::fill(std::begin(range), std::end(range), std::forward<T>(value));
}

}  // namespace util
}  // namespace kod

namespace kod {
namespace sol {

template <class T> constexpr bool setmin(T& lhs, const T& rhs) {
    if (lhs > rhs) {
        lhs = rhs;
        return true;
    }
    return false;
}
template <class T> constexpr bool setmax(T& lhs, const T& rhs) {
    if (lhs < rhs) {
        lhs = rhs;
        return true;
    }
    return false;
}

template <class T, std::enable_if_t<std::is_integral_v<T>>* = nullptr>
constexpr T infty = std::numeric_limits<T>::max() / 2;

using i32 = std::int32_t;
using u32 = std::uint32_t;
using i64 = std::int64_t;
using u64 = std::uint64_t;
using i128 = __int128_t;
using u128 = __uint128_t;

using std::array;
using std::pair;
using std::tuple;
using std::vector;

using namespace util;

void run();

}  // namespace sol
}  // namespace kod

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout << std::fixed << std::setprecision(20);
    std::cerr << std::unitbuf;
    int cases = 1;
#ifdef MULTI_TESTCASES
    std::cin >> cases;
#endif
    while (cases--) kod::sol::run();
    return 0;
}

namespace kod {
namespace sol {

void run() {
    const int n = scan<int>();
    const auto a = scan_vec<int>(n);
    const auto b = scan_vec<int>(n);
    vector<array<int, 4>> node = {{-1, -1, -1, 0}};
    const auto add = [&](int x) {
        vector<int> v;
        while (x > 0) {
            v.push_back(x);
            x /= 2;
        }
        std::reverse(v.begin(), v.end());
        int n = 0, a = 0;
        for (const int b : v) {
            const int k = b - 2 * a;
            if (node[n][k] == -1) {
                node[n][k] = node.size();
                node.push_back({-1, -1, n, 0});
            }
            n = node[n][k];
            a = b;
        }
        return n;
    };
    for (const int x : a) {
        node[add(x)][3] += 1;
    }
    for (const int x : b) {
        node[add(x)][3] -= 1;
    }
    int ans = 0;
    const bool can = fixed([&](auto&& dfs, const int u) -> bool {
        const int l = node[u][0];
        const int r = node[u][1];
        if (l != -1) {
            if (!dfs(l)) return false;
            ans += std::abs(node[l][3]);
            node[u][3] += node[l][3];
        }
        if (r != -1) {
            if (!(dfs(r)) or node[r][3] < 0) return false;
            ans += node[r][3];
            node[u][3] += node[r][3];
        }
        return true;
    })(0);
    println(can ? ans : -1);
}

}  // namespace sol
}  // namespace kod

Submission Info

Submission Time
Task Ex - Multiply or Divide by 2
User KoD
Language C++ (GCC 9.2.1)
Score 600
Code Size 10077 Byte
Status AC
Exec Time 128 ms
Memory 36956 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 46
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_srnd_00.txt, 01_srnd_01.txt, 01_srnd_02.txt, 01_srnd_03.txt, 01_srnd_04.txt, 01_srnd_05.txt, 01_srnd_06.txt, 01_srnd_07.txt, 01_srnd_08.txt, 01_srnd_09.txt, 01_srnd_10.txt, 01_srnd_11.txt, 01_srnd_12.txt, 01_srnd_13.txt, 02_rnd_00.txt, 02_rnd_01.txt, 02_rnd_02.txt, 02_rnd_03.txt, 02_rnd_04.txt, 02_rnd_05.txt, 02_rnd_06.txt, 02_rnd_07.txt, 03_rndl_00.txt, 03_rndl_01.txt, 03_rndl_02.txt, 03_rndl_03.txt, 03_rndl_04.txt, 03_rndl_05.txt, 03_rndl_06.txt, 03_rndl_07.txt, 03_rndl_08.txt, 03_rndl_09.txt, 03_rndl_10.txt, 03_rndl_11.txt, 04_max_00.txt, 04_max_01.txt, 04_max_02.txt, 04_max_03.txt, 04_max_04.txt, 04_max_05.txt, 04_max_06.txt, 05_tozero_00.txt, 05_tozero_01.txt, 05_tozero_02.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 7 ms 3440 KiB
00_sample_01.txt AC 2 ms 3444 KiB
01_srnd_00.txt AC 2 ms 3508 KiB
01_srnd_01.txt AC 2 ms 3452 KiB
01_srnd_02.txt AC 2 ms 3484 KiB
01_srnd_03.txt AC 4 ms 3432 KiB
01_srnd_04.txt AC 2 ms 3432 KiB
01_srnd_05.txt AC 2 ms 3432 KiB
01_srnd_06.txt AC 2 ms 3452 KiB
01_srnd_07.txt AC 2 ms 3480 KiB
01_srnd_08.txt AC 1 ms 3472 KiB
01_srnd_09.txt AC 2 ms 3520 KiB
01_srnd_10.txt AC 2 ms 3484 KiB
01_srnd_11.txt AC 2 ms 3448 KiB
01_srnd_12.txt AC 1 ms 3452 KiB
01_srnd_13.txt AC 2 ms 3440 KiB
02_rnd_00.txt AC 99 ms 36816 KiB
02_rnd_01.txt AC 100 ms 36892 KiB
02_rnd_02.txt AC 104 ms 36900 KiB
02_rnd_03.txt AC 114 ms 36836 KiB
02_rnd_04.txt AC 113 ms 36900 KiB
02_rnd_05.txt AC 110 ms 36948 KiB
02_rnd_06.txt AC 111 ms 36888 KiB
02_rnd_07.txt AC 126 ms 36836 KiB
03_rndl_00.txt AC 108 ms 36888 KiB
03_rndl_01.txt AC 108 ms 36948 KiB
03_rndl_02.txt AC 109 ms 36816 KiB
03_rndl_03.txt AC 128 ms 36940 KiB
03_rndl_04.txt AC 109 ms 36956 KiB
03_rndl_05.txt AC 111 ms 36900 KiB
03_rndl_06.txt AC 112 ms 36844 KiB
03_rndl_07.txt AC 124 ms 36952 KiB
03_rndl_08.txt AC 111 ms 36952 KiB
03_rndl_09.txt AC 111 ms 36904 KiB
03_rndl_10.txt AC 113 ms 36840 KiB
03_rndl_11.txt AC 127 ms 36956 KiB
04_max_00.txt AC 63 ms 3920 KiB
04_max_01.txt AC 58 ms 3916 KiB
04_max_02.txt AC 58 ms 3772 KiB
04_max_03.txt AC 58 ms 3824 KiB
04_max_04.txt AC 58 ms 3920 KiB
04_max_05.txt AC 59 ms 3916 KiB
04_max_06.txt AC 58 ms 3920 KiB
05_tozero_00.txt AC 89 ms 36896 KiB
05_tozero_01.txt AC 88 ms 36928 KiB
05_tozero_02.txt AC 87 ms 36892 KiB