Submission #1311292

#TimeUsernameProblemLanguageResultExecution timeMemory
1311292syanvuVinjete (COI22_vinjete)C++20
100 / 100
656 ms262188 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 = 1e7 + 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[MX]; int add[MX], L[MX], R[MX], timer = 1; 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(t[v].mx == 0 || t[v].cnt == 0) t[v].cnt = tr - tl + 1; 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[L[v]] += add[v]; add[R[v]] += add[v]; } add[v] = 0; } void upd(int v, int tl, int tr, int l, int r, int x){ if(!L[v]) L[v] = ++timer; if(!R[v]) R[v] = ++timer; push(v, tl, tr); if(tl > r || l > tr) return; 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(L[v], tl, mid, l, r, x); upd(R[v], mid + 1, tr, l, r, x); if(!t[R[v]].cnt) t[R[v]].cnt = tr - mid; if(!t[L[v]].cnt) t[L[v]].cnt = mid - tl + 1; t[v] = f(t[L[v]], t[R[v]]); } void dfs(int v, int p){ 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}); } 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...