제출 #1209452

#제출 시각아이디문제언어결과실행 시간메모리
1209452FatonimVinjete (COI22_vinjete)C++20
56 / 100
175 ms39380 KiB
#include <bits/stdc++.h> using namespace std; #ifdef ONPC #include "debug.h" #else #define dbg(...) #endif #define ll long long #define int long long #define ld long double #define pi pair<int, int> #define sz(a) ((int)(a.size())) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define sqr(n) ((n) * (n)) #define divup(a, b) (((a) + (b)-1) / (b)) #define popcount(n) __builtin_popcountll(n) #define clz(n) __builtin_clzll(n) #define Fixed(a) cout << fixed << setprecision(12) << a; template <class T> bool chmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; } template <class T> bool chmax(T& a, const T& b) { return b > a ? a = b, 1 : 0; } const int mod = 998244353; // 998244353 1e9 + 7 const ll inf = (ll)(1e18) + 7; const ld eps = 1e-9; const int B = 32; const int N = 1000 + 3; const int logn = 20; const int maxn = 2e5 + 7; /////////////////////////solve///////////////////////// struct segtree { public: struct node { int mn = 0; int cnt = 0; int add = 0; void apply(int tl, int tr, int x) { mn += x; add += x; } }; private: int n; vector<node> tree; node unite(const node& a, const node& b) { node res; res.mn = min(a.mn, b.mn); if (res.mn == a.mn) res.cnt += a.cnt; if (res.mn == b.mn) res.cnt += b.cnt; return res; } void push(int v, int tl, int tr) { int tm = (tl + tr) >> 1; if (tree[v].add != 0) { tree[2 * v].apply(tl, tm, tree[v].add); tree[2 * v + 1].apply(tm, tr, tree[v].add); tree[v].add = 0; } } template <class T> void build(const vector<T>& a, int v, int tl, int tr) { if (tr - tl == 1) { tree[v].apply(tl, tr, a[tl]); return; } int tm = (tl + tr) >> 1; build(a, 2 * v, tl, tm); build(a, 2 * v + 1, tm, tr); tree[v] = unite(tree[2 * v], tree[2 * v + 1]); } void build(int v, int tl, int tr) { if (tr - tl == 1) { tree[v].cnt = 1; return; } int tm = (tl + tr) >> 1; build(2 * v, tl, tm); build(2 * v + 1, tm, tr); tree[v] = unite(tree[2 * v], tree[2 * v + 1]); } template <class T> void update(int l, int r, const T& x, int v, int tl, int tr) { if (tl >= r || tr <= l) return; if (tl >= l && tr <= r) { tree[v].apply(tl, tr, x); return; } int tm = (tl + tr) >> 1; push(v, tl, tr); update(l, r, x, 2 * v, tl, tm); update(l, r, x, 2 * v + 1, tm, tr); tree[v] = unite(tree[2 * v], tree[2 * v + 1]); } node get(int l, int r, int v, int tl, int tr) { if (tl >= l && tr <= r) return tree[v]; int tm = (tl + tr) >> 1; push(v, tl, tr); if (tm <= l) return get(l, r, 2 * v + 1, tm, tr); if (tm >= r) return get(l, r, 2 * v, tl, tm); return unite(get(l, r, 2 * v, tl, tm), get(l, r, 2 * v + 1, tm, tr)); } public: segtree(int n) : n(n) { tree.resize(4 * n); build(1, 0, n); } template <class T> segtree(const vector<T>& a) { n = sz(a); tree.resize(4 * n); build(a, 1, 0, n); } template <class T> void update(int l, int r, const T& x) { update(l, r, x, 1, 0, n); } template <class T> void update(int i, const T& x) { update(i, i + 1, x, 1, 0, n); } node get(int l, int r) { return get(l, r, 1, 0, n); } node get(int i) { return get(i, i + 1, 1, 0, n); } }; vector<pair<int, pi>> g[maxn]; segtree st(1); int ans[maxn]; int n, m; void dfs(int v, int p = -1) { segtree::node cur = st.get(0, m); int cnt = 0; if (cur.mn == 0) cnt = cur.cnt; ans[v] = m - cnt; // dbg(cur.mn, cnt); for (auto [u, seg] : g[v]) { if (u != p) { auto [l, r] = seg; st.update(l, r + 1, 1); dfs(u, v); st.update(l, r + 1, -1); } } } void solve() { cin >> n >> m; for (int i = 1; i < n; ++i) { int v, u, l, r; cin >> v >> u >> l >> r; --v; --u; --l; --r; g[v].push_back({u, {l, r}}); g[u].push_back({v, {l, r}}); } st = segtree(m); dfs(0); for (int i = 1; i < n; ++i) { cout << ans[i] << "\n"; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifdef ONPC freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); freopen("error.txt", "w", stderr); #endif 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...