제출 #1210211

#제출 시각아이디문제언어결과실행 시간메모리
1210211bakhtiyarnVinjete (COI22_vinjete)C++20
0 / 100
4 ms3144 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define int long long template<typename K, typename V> using hash_table = gp_hash_table<K, V>; const int N = 1e5 + 5; int n, M; vector<array<int, 3>> g[N]; int ans[N]; hash_table<int, int> L, R, lz, sg; vector<array<int, 2>> chsg, chlz; int nxt = 1; void push(int u, int l, int r) { if (lz[u] == 0) return; if (sg.find(u) == sg.end()) chsg.push_back({u, 0}); else chsg.push_back({u, sg[u]}); sg[u] = r - l + 1; if (l != r) { int m = (l + r) / 2; if (!L[u]) L[u] = ++nxt; if (!R[u]) R[u] = ++nxt; if (lz.find(L[u]) == lz.end()) chlz.push_back({L[u], 0}); else chlz.push_back({L[u], lz[L[u]]}); if (lz.find(R[u]) == lz.end()) chlz.push_back({R[u], 0}); else chlz.push_back({R[u], lz[R[u]]}); lz[L[u]] += lz[u]; lz[R[u]] += lz[u]; } lz[u] = 0; } void update(int u, int l, int r, int x, int y) { push(u, l, r); if (r < x || y < l) return; if (x <= l && r <= y) { if (lz.find(u) == lz.end()) chlz.push_back({u, 0}); else chlz.push_back({u, lz[u]}); lz[u]++; push(u, l, r); return; } int m = (l + r) / 2; if (!L[u]) L[u] = ++nxt; if (!R[u]) R[u] = ++nxt; update(L[u], l, m, x, y); update(R[u], m + 1, r, x, y); if (sg.find(u) == sg.end()) chsg.push_back({u, 0}); else chsg.push_back({u, sg[u]}); sg[u] = sg[L[u]] + sg[R[u]]; } void dfs(int u, int p, int li, int ri) { chsg.clear(); chlz.clear(); if (li && ri) update(1, 1, M, li, ri); ans[u] = sg[1]; for (auto [v, l, r] : g[u]) { if (v == p) continue; dfs(v, u, l, r); } for (int i = chsg.size() - 1; i >= 0; --i) { auto [x, val] = chsg[i]; sg[x] = val; } for (int i = chlz.size() - 1; i >= 0; --i) { auto [x, val] = chlz[i]; lz[x] = val; } } signed main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> M; for (int i = 1; i < n; ++i) { int u, v, l, r; cin >> u >> v >> l >> r; g[u].push_back({v, l, r}); g[v].push_back({u, l, r}); } dfs(1, -1, 0, 0); for (int i = 2; i <= n; ++i) cout << ans[i] << '\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...