Submission #1195533

#TimeUsernameProblemLanguageResultExecution timeMemory
1195533raphaelpVinjete (COI22_vinjete)C++20
100 / 100
291 ms34596 KiB
#include <bits/stdc++.h> using namespace std; class SegTree { private: int N, cur = 2; vector<int> st, minn, lazy; int l(int x) { return (x << 1); } int r(int x) { return (x << 1) + 1; } void propagate(int L, int R, int x) { minn[x] += lazy[x]; if (L != R) { lazy[l(x)] += lazy[x]; lazy[r(x)] += lazy[x]; } lazy[x] = 0; } void update(int L, int R, int a, int b, int val, int x) { propagate(L, R, x); if (L > b || R < a) return; if (L >= a && R <= b) { lazy[x] += val; propagate(L, R, x); } else { int m = (L + R) / 2; update(L, m, a, b, val, l(x)); update(m + 1, R, a, b, val, r(x)); minn[x] = min(minn[l(x)], minn[r(x)]); st[x] = 0; if (minn[l(x)] == minn[x]) st[x] += st[l(x)]; if (minn[r(x)] == minn[x]) st[x] += st[r(x)]; } } public: SegTree(vector<int> &A) { N = pow(2, ceil(log2(A.size()))); st.assign(2 * N, 0); minn.assign(2 * N, 0); lazy.assign(2 * N, 0); for (int i = N; i < N + A.size(); i++) st[i] = A[i - N]; for (int i = N - 1; i > 0; i--) st[i] = st[l(i)] + st[r(i)]; } void update(int a, int b, int val) { update(0, N - 1, a, b, val, 1); } int Q() { return ((minn[1] == 0) ? st[1] : 0); } }; void dfs(int x, int p, vector<vector<vector<int>>> &AR, SegTree &ST, vector<int> &ans) { ans[x] = ST.Q(); for (int i = 0; i < AR[x].size(); i++) { if (AR[x][i][0] == p) continue; ST.update(AR[x][i][1], AR[x][i][2] - 1, 1); dfs(AR[x][i][0], x, AR, ST, ans); ST.update(AR[x][i][1], AR[x][i][2] - 1, -1); } } int main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); int N, M; cin >> N >> M; vector<vector<vector<int>>> AR(N); vector<int> imp; for (int i = 0; i < N - 1; i++) { int a, b, l, r; cin >> a >> b >> l >> r; a--, b--; imp.push_back(l - 1); imp.push_back(r); AR[a].push_back({b, l - 1, r}); AR[b].push_back({a, l - 1, r}); } sort(imp.begin(), imp.end()); vector<int> pond, imp2(1, -1); int last = 0; for (int i = 0; i < imp.size(); i++) { if (i == 0 || imp[i] != imp[i - 1]) { imp2.push_back(imp[i]); pond.push_back(imp[i] - last); last = imp[i]; } } pond.push_back(M - last); swap(imp, imp2); for (int i = 0; i < N; i++) { for (int j = 0; j < AR[i].size(); j++) { AR[i][j][1] = lower_bound(imp.begin(), imp.end(), AR[i][j][1]) - imp.begin(); AR[i][j][2] = lower_bound(imp.begin(), imp.end(), AR[i][j][2]) - imp.begin(); } } SegTree ST(pond); vector<int> ans(N); dfs(0, 0, AR, ST, ans); for (int i = 1; i < N; i++) cout << M - 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...