Submission #641424

#TimeUsernameProblemLanguageResultExecution timeMemory
641424DragonO_oPaths (RMI21_paths)C++17
36 / 100
1081 ms18596 KiB
#pragma GCC optimize("Ofast") //#pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") //#pragma GCC optimize("inline,Ofast,no-stack-protector,unroll-loops,fast-math,O3") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,popcnt,avx,abm") #include <bits/stdc++.h> using namespace std; //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> //using namespace __gnu_pbds; //#define ordered_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> #define sz(x) (int)(x).size() #define int long long #define FOR(i,l,r) for(int i=l;i<=(r);++i) #define FORd(i,r,l) for(int i=r;i>=(l);--i) #define pb push_back #define x first #define y second #define lb lower_bound #define ub upper_bound #define all(x) x.begin(),x.end() #define ins insert typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair<int,int>pii; typedef pair<ll,ll>pll; typedef vector<ll>vll; typedef vector<int>vi; typedef vector<bool>vb; typedef vector<vi>vvi; typedef vector<vll>vvll; typedef vector<pii>vpii; typedef vector<pll>vpll; const int N=2e5+25; const int MOD=1e9+7; const int INF=1e18; const char nl='\n'; int n,k; vpii g[N]; int dist[N]; int down[N]; int up[N]; void pre_calc1(int v,int p){ for(auto [to,w]:g[v]){ if(to!=p){ dist[to]=dist[v]+w; pre_calc1(to,v); } } down[v]=v; for(auto [to,w]:g[v]){ if(to!=p){ if(dist[down[to]]>=dist[down[v]]){ down[v]=down[to]; } } } } void pre_calc2(int v,int p){ set<pii,greater<pii>>st; for(auto [to,w]:g[v]){ if(to!=p){ st.insert({dist[down[to]]-dist[v],down[to]}); } } for(auto [to,w]:g[v]){ if(to!=p){ up[to]=up[v]; st.erase({dist[down[to]]-dist[v],down[to]}); pii best=*st.begin(); if(!st.empty() && w+best.x>dist[to]+dist[up[to]]){ up[to]=best.y; } st.insert({dist[down[to]]-dist[v],down[to]}); } } for(auto [to,w]:g[v]){ if(to!=p){ pre_calc2(to,v); } } } int a[N]; int val[N]; multiset<int,greater<int>>take,rest; void dfs(int v,int p){ if(!a[down[v]]){ a[down[v]]=p; val[down[v]]=dist[down[v]]-dist[p]; rest.insert(val[down[v]]); } for(auto [to,w]:g[v]){ if(to!=p){ dfs(to,v); } } } void solve(){ cin>>n>>k; for(int i=1;i<n;++i){ int u,v,w; cin>>u>>v>>w; g[u].pb({v,w}); g[v].pb({u,w}); } for(int root=1;root<=n;++root){ for(int i=1;i<=n;++i){ dist[i]=down[i]=up[i]=a[i]=val[i]=0; } take.clear(); rest.clear(); pre_calc1(root,root); up[root]=root; pre_calc2(root,root); dfs(root,root); int cnt=0; while(cnt++<k){ int beg=*rest.begin(); take.insert(beg); rest.erase(rest.find(beg)); } int ans=0; for(int it:take){ ans+=it; } cout<<ans<<nl; } } /** 11 3 1 2 5 2 3 3 2 6 5 3 4 4 3 5 2 1 7 6 7 8 4 7 9 5 1 10 1 10 11 1 **/ int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); 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...
#Verdict Execution timeMemoryGrader output
Fetching results...