제출 #1204138

#제출 시각아이디문제언어결과실행 시간메모리
120413812345678Paths (RMI21_paths)C++20
36 / 100
1102 ms174980 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int nx=1e5+5; mt19937 rng(12345678); ll n, k, u, v, w, mx[nx]; vector<pair<ll, ll>> d[nx]; struct treap { struct node { ll sm, sz, vl, p; node *l, *r; node(ll vl): sm(vl), sz(1), vl(vl), p(rng()), l(0), r(0) {} }; typedef node* pnode; pnode rt=0; ll size(pnode x) {return x?x->sz:0;} ll sum(pnode x) {return x?x->sm:0;} void update(pnode x) { if (!x) return; x->sz=size(x->l)+size(x->r)+1; x->sm=sum(x->l)+sum(x->r)+x->vl; } void merge(pnode l, pnode r, pnode &k) { if (!l) k=r; else if (!r) k=l; else if (l->p>=r->p) merge(l->r, r, l->r), k=l; else merge(l, r->l, r->l), k=r; update(k); } void splitlowerbound(pnode &l, pnode &r, pnode k, ll value) { if (!k) return l=r=0, void(); if (k->vl<value) splitlowerbound(k->r, r, k->r, value), l=k; else splitlowerbound(l, k->l, k->l, value), r=k; update(l); update(r); } void splitleft(pnode &l, pnode &r, pnode k, ll key) { if (!k) return l=r=0, void(); if (1+size(k->l)<=key) splitleft(k->r, r, k->r, key-(1+size(k->l))), l=k; else splitleft(l, k->l, k->l, key), r=k; update(l); update(r); } void splitright(pnode &l, pnode &r, pnode k, ll key) { if (!k) return l=r=0, void(); if (1+size(k->r)<=key) splitright(l, k->l, k->l, key-(1+size(k->r))), r=k; else splitright(k->r, r, k->r, key), l=k; update(l); update(r); } void add(ll x) { //cout<<"x "<<x<<'\n'; pnode p1, p2; splitlowerbound(p1, p2, rt, x); //cout<<"add "<<p1<<' '<<p2<<' '<<rt<<'\n'; merge(p1, new node(x), p1); //cout<<"p1 "<<p1->vl<<'\n'; merge(p1, p2, rt); //cout<<"after "<<rt<<' '<<rt->vl<<'\n'; } void remove(ll x) { pnode p1, p2, p3; splitlowerbound(p1, p2, rt, x); splitleft(p2, p3, p2, 1); merge(p1, p3, rt); } ll query() { pnode p1, p2; splitright(p1, p2, rt, k); ll tmp=p2->sm; merge(p1, p2, rt); return tmp; } void show(pnode x) { if (!x) return; show(x->l); cout<<x->vl<<' '; show(x->r); } } t; void dfs(int u, int p) { for (auto [v, w]:d[u]) { if (v==p) continue; dfs(v, u); mx[u]=max(mx[u], mx[v]+w); if (mx[v]) t.remove(mx[v]); t.add(mx[v]+w); } //t.show(t.rt); //cout<<'\n'; //cout<<"after "<<u<<' '<<t.size(t.rt)<<'\n'; } int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>k; for (int i=1; i<n; i++) cin>>u>>v>>w, d[u].push_back({v, w}), d[v].push_back({u, w}); for (int rt=1; rt<=n; rt++) { for (int i=1; i<=n; i++) mx[i]=0; t.rt=0; dfs(rt, rt); cout<<t.query()<<'\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...
#Verdict Execution timeMemoryGrader output
Fetching results...