제출 #1311229

#제출 시각아이디문제언어결과실행 시간메모리
1311229syanvuVinjete (COI22_vinjete)C++20
0 / 100
2 ms568 KiB
// #pragma optimize ("g",on) // #pragma GCC optimize ("inline") // #pragma GCC optimize ("Ofast") // #pragma GCC optimize ("unroll-loops") // #pragma GCC optimize ("03") #include <bits/stdc++.h> #define pb push_back #define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr); // #define int long long #define all(v) v.begin(),v.end() using namespace std; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); const int N = 1e5 + 17, MX = 1e6 + 1, inf = 1e9, mod = 998244353; int n, m; vector<array<int, 3>> g[N]; int ans[N]; struct node{ int ans, mn, mx, cnt; }; node t[4 * N]; int add[4 * N]; node f(node a, node b){ node res; res.ans = a.ans + b.ans; if(a.mn < b.mn) res.mn = a.mn, res.cnt = a.cnt; else if(a.mn > b.mn) res.mn = b.mn, res.cnt = b.cnt; else res.mn = a.mn, res.cnt = a.cnt + b.cnt; res.mx = max(a.mx, b.mx); return res; } void push(int v, int tl, int tr){ if(add[v] == 0) return; if(add[v] < 0){ if(t[v].mx + add[v] <= 0){ t[v].mx = t[v].mn = t[v].ans = 0; t[v].cnt = tr - tl + 1; } else if(t[v].mn + add[v] > 0){ t[v].mx += add[v]; t[v].mn += add[v]; } } else{ if(t[v].mn == 0) t[v].ans += t[v].cnt; t[v].mn += add[v]; t[v].mx += add[v]; } if(tl < tr){ add[v * 2] += add[v]; add[v * 2 + 1] += add[v]; } add[v] = 0; } void build(int v, int tl, int tr){ if(tl == tr){ t[v] = {0, 0, 0, 1}; return; } int mid = (tl + tr) / 2; build(v * 2, tl, mid); build(v * 2 + 1, mid + 1, tr); t[v] = f(t[v * 2], t[v * 2 + 1]); } void upd(int v, int tl, int tr, int l, int r, int x){ if(tl > r || l > tr) return; push(v, tl, tr); if(tl >= l && r >= tr && (add[v] + x >= 0 || t[v].mn + add[v] + x > 0 || t[v].mx + add[v] + x <= 0)){ add[v] += x; push(v, tl, tr); return; } int mid = (tl + tr) / 2; upd(v * 2, tl, mid, l, r, x); upd(v * 2 + 1, mid + 1, tr, l, r, x); t[v] = f(t[v * 2], t[v * 2 + 1]); } void dfs(int v, int p){ push(1, 1, m); ans[v] = t[1].ans; for(auto [to, l, r] : g[v]){ if(to == p) continue; upd(1, 1, m, l, r, 1); dfs(to, v); upd(1, 1, m, l, r, -1); } } void solve(){ cin >> n >> m; for(int i = 1; i < n; i++){ int a, b, l, r; cin >> a >> b >> l >> r; g[a].push_back({b, l, r}); g[b].push_back({a, l, r}); } build(1, 1, m); dfs(1, 1); for(int i = 2; i <= n; i++){ cout << ans[i] << '\n'; } } signed main(){ SS // freopen("trains.in", "r", stdin); // freopen("trains.out", "w", stdout); int t = 1; // cin >> t; while(t--){ solve(); } }
#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...