結果

問題 No.1637 Easy Tree Query
ユーザー HaarHaar
提出日時 2021-08-06 21:30:00
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 74 ms / 2,000 ms
コード長 5,227 bytes
コンパイル時間 2,170 ms
コンパイル使用メモリ 210,800 KB
実行使用メモリ 16,940 KB
最終ジャッジ日時 2023-10-17 04:57:53
合計ジャッジ時間 6,194 ms
ジャッジサーバーID
(参考情報)
judge14 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,348 KB
testcase_01 AC 2 ms
4,348 KB
testcase_02 AC 63 ms
11,396 KB
testcase_03 AC 2 ms
4,348 KB
testcase_04 AC 26 ms
7,268 KB
testcase_05 AC 43 ms
6,188 KB
testcase_06 AC 30 ms
5,580 KB
testcase_07 AC 13 ms
4,348 KB
testcase_08 AC 21 ms
6,444 KB
testcase_09 AC 48 ms
9,344 KB
testcase_10 AC 23 ms
5,148 KB
testcase_11 AC 61 ms
9,812 KB
testcase_12 AC 54 ms
8,236 KB
testcase_13 AC 14 ms
5,080 KB
testcase_14 AC 40 ms
9,284 KB
testcase_15 AC 59 ms
10,076 KB
testcase_16 AC 55 ms
10,868 KB
testcase_17 AC 17 ms
5,076 KB
testcase_18 AC 41 ms
6,188 KB
testcase_19 AC 44 ms
6,748 KB
testcase_20 AC 58 ms
8,228 KB
testcase_21 AC 35 ms
7,436 KB
testcase_22 AC 71 ms
10,868 KB
testcase_23 AC 19 ms
5,660 KB
testcase_24 AC 32 ms
7,436 KB
testcase_25 AC 44 ms
5,972 KB
testcase_26 AC 58 ms
8,508 KB
testcase_27 AC 74 ms
10,604 KB
testcase_28 AC 34 ms
5,912 KB
testcase_29 AC 51 ms
7,964 KB
testcase_30 AC 28 ms
7,964 KB
testcase_31 AC 26 ms
4,348 KB
testcase_32 AC 27 ms
6,116 KB
testcase_33 AC 38 ms
5,192 KB
testcase_34 AC 40 ms
16,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

#ifdef DEBUG
#include <Mylib/Debug/debug.cpp>
#else
#define dump(...) ((void)0)
#endif

template <typename T, typename U>
bool chmin(T &a, const U &b) {
  return (a > b ? a = b, true : false);
}

template <typename T, typename U>
bool chmax(T &a, const U &b) {
  return (a < b ? a = b, true : false);
}

template <typename T, size_t N, typename U>
void fill_array(T (&a)[N], const U &v) {
  std::fill((U *) a, (U *) (a + N), v);
}

template <typename T, size_t N, size_t I = N>
auto make_vector(const std::array<int, N> &a, T value = T()) {
  static_assert(I >= 1);
  static_assert(N >= 1);
  if constexpr (I == 1) {
      return std::vector<T>(a[N - I], value);
    } else {
    return std::vector(a[N - I], make_vector<T, N, I - 1>(a, value));
  }
}

template <typename T>
std::ostream &operator<<(std::ostream &s, const std::vector<T> &a) {
  for (auto it = a.begin(); it != a.end(); ++it) {
    if (it != a.begin()) s << " ";
    s << *it;
  }
  return s;
}

template <typename T>
std::istream &operator>>(std::istream &s, std::vector<T> &a) {
  for (auto &x : a) s >> x;
  return s;
}

std::string YesNo(bool value) { return value ? "Yes" : "No"; }
std::string YESNO(bool value) { return value ? "YES" : "NO"; }
std::string yesno(bool value) { return value ? "yes" : "no"; }

template <typename T>
void putl(const T &value) {
  std::cout << value << "\n";
}

template <typename Head, typename... Tail>
void putl(const Head head, const Tail &... tail) {
  std::cout << head << " ";
  putl(tail...);
}

namespace haar_lib {
  template <typename T>
  struct edge {
    int from, to;
    T cost;
    int index = -1;
    edge() {}
    edge(int from, int to, T cost) : from(from), to(to), cost(cost) {}
    edge(int from, int to, T cost, int index) : from(from), to(to), cost(cost), index(index) {}
  };

  template <typename T>
  struct graph {
    using weight_type = T;
    using edge_type   = edge<T>;

    std::vector<std::vector<edge<T>>> data;

    auto& operator[](size_t i) { return data[i]; }
    const auto& operator[](size_t i) const { return data[i]; }

    auto begin() const { return data.begin(); }
    auto end() const { return data.end(); }

    graph() {}
    graph(int N) : data(N) {}

    bool empty() const { return data.empty(); }
    int size() const { return data.size(); }

    void add_edge(int i, int j, T w, int index = -1) {
      data[i].emplace_back(i, j, w, index);
    }

    void add_undirected(int i, int j, T w, int index = -1) {
      add_edge(i, j, w, index);
      add_edge(j, i, w, index);
    }

    template <size_t I, bool DIRECTED = true, bool WEIGHTED = true>
    void read(int M) {
      for (int i = 0; i < M; ++i) {
        int u, v;
        std::cin >> u >> v;
        u -= I;
        v -= I;
        T w = 1;
        if (WEIGHTED) std::cin >> w;
        if (DIRECTED)
          add_edge(u, v, w, i);
        else
          add_undirected(u, v, w, i);
      }
    }
  };

  template <typename T>
  using tree = graph<T>;
}  // namespace haar_lib

namespace haar_lib {
  template <typename T>
  void rooting(tree<T> &tr, int cur, int par = -1) {
    if (par != -1) {
      for (auto it = tr[cur].begin(); it != tr[cur].end(); ++it) {
        if (it->to == par) {
          tr[cur].erase(it);
          break;
        }
      }
    }

    for (auto &e : tr[cur]) {
      rooting(tr, e.to, cur);
    }
  }
}  // namespace haar_lib

namespace haar_lib {
  template <typename F>
  struct fix_point : F {
    explicit constexpr fix_point(F &&f) noexcept : F(std::forward<F>(f)) {}

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

  template <typename F>
  inline constexpr auto make_fix_point(F &&f) {
    return fix_point<F>(std::forward<F>(f));
  }

  template <typename F>
  inline constexpr auto make_fix_point(F &f) {
    return fix_point<F>(std::forward<F>(f));
  }
}  // namespace haar_lib



namespace haar_lib {}

namespace solver {
  using namespace haar_lib;

  constexpr int m1000000007 = 1000000007;
  constexpr int m998244353  = 998244353;

  void init() {
    std::cin.tie(0);
    std::ios::sync_with_stdio(false);
    std::cout << std::fixed << std::setprecision(12);
    std::cerr << std::fixed << std::setprecision(12);
    std::cin.exceptions(std::ios_base::failbit);
  }

  void solve() {
    int N, Q; std::cin >> N >> Q;
    graph<int> g(N);
    g.read<1, false, false>(N - 1);
    rooting(g, 0);

    auto count = std::vector<int>(N);

    fix_point([&](auto &f, int i) -> int {
                count[i] = 1;

                for (auto &e : g[i]) {
                  count[i] += f(e.to);
                }

                return count[i];
              })(0);

    dump(count);

    int64_t ans = 0;

    for (int i = 0; i < Q; ++i) {
      int64_t p, x; std::cin >> p >> x;
      --p;

      ans += x * count[p];
      std::cout << ans << "\n";
    }
  }
}

int main() {
  solver::init();
  while (true) {
    try {
      solver::solve();
      std::cout << std::flush;
      std::cerr << std::flush;
    } catch (const std::istream::failure &e) {
      break;
    } catch (...) {
      break;
    }
  }
  return 0;
}
0