제출 #1318339

#제출 시각아이디문제언어결과실행 시간메모리
13183394QT0RSumtree (INOI20_sumtree)C++20
50 / 100
3095 ms36532 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const ll mod = 1e9 + 7; vector<ll> graph[200003]; ll fat[200003]; ll label[200003]; bool has_label[200003]; ll label_sum[200003]; ll siz[200003]; void path_add(ll v, ll p, ll roz, ll sum) { while (v != fat[p]) { siz[v] += roz; label_sum[v] += sum; v = fat[v]; } } void prep(ll v, ll p) { fat[v] = p; siz[v] = 1; for (auto u : graph[v]) { if (u == p) continue; prep(u, v); siz[v] += siz[u]; } } ll fact[500003]; ll fact_inv[500003]; ll fast_pow(ll a, ll b) { if (b == 1) return a; ll cur = fast_pow(a, b / 2); cur = (cur * cur) % mod; if (b & 1) cur = (cur * a) % mod; return cur; } void init(ll &n, ll &r, ll &q) { cin >> n >> r; for (ll i = 1, a, b; i < n; i++) { cin >> a >> b; graph[a].push_back(b); graph[b].push_back(a); } cin >> q; fact[0] = 1; for (ll i = 1; i <= 500002; i++) fact[i] = (i * fact[i - 1]) % mod; fact_inv[500002] = fast_pow(fact[500002], mod - 2); for (ll i = 500001; i >= 0; i--) fact_inv[i] = ((i + 1) * fact_inv[i + 1]) % mod; } ll res(ll roz, ll tag) { ll wyn = fact[roz + tag - 1]; wyn = (wyn * fact_inv[tag]) % mod; wyn = (wyn * fact_inv[roz - 1]) % mod; return wyn; } ll Find(ll v) { if (has_label[v]) return v; return Find(fat[v]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); ll n, q; init(n, label[1], q); has_label[1] = true; prep(1, 0); ll ans = res(n, label[1]), neg_vert = 0; cout << ans << '\n'; auto modify_ans = [&](ll roz, ll lab, ll inv) -> void { if (lab < 0) { neg_vert += inv; return; } if (inv == 1) ans = (ans * res(roz, lab)) % mod; else ans = (ans * fast_pow(res(roz, lab), mod - 2)) % mod; }; for (ll i = 1, t, v, tag; i <= q; i++) { cin >> t >> v; if (t == 1) cin >> tag; ll up = Find(fat[v]); modify_ans(siz[up], label[up] + label_sum[up], -1); if (t == 1) { has_label[v] = true; label[v] = tag; modify_ans(siz[v], label[v] + label_sum[v], 1); path_add(fat[v], up, -siz[v], -label[v] - label_sum[v]); } else { path_add(fat[v], up, siz[v], label[v] + label_sum[v]); modify_ans(siz[v], label[v] + label_sum[v], -1); label[v] = 0; has_label[v] = false; } modify_ans(siz[up], label[up] + label_sum[up], 1); cout << (neg_vert ? 0 : ans) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...