————————————————————————————————————————————---
补了一个坑,要学学STL了
努力向本题的55分迈进
——————————————————————————————————————————————
#include<bits/stdc++.h> using namespace std; int ne,head[50100],tmp,n,m,a,b,c,d[50100<<1],ml,ans; struct node{int to,nxt,dis;}eg[50100<<1]; multiset<int> s[50100]; multiset<int>::iterator it; void adde(int u,int v,int c) {eg[++ne].to=v;eg[ne].dis=c;eg[ne].nxt=head[u];head[u]=ne;} void dfs(int u,int fa) { for(int i=head[u];i;i=eg[i].nxt) { int v=eg[i].to; if(fa==v)continue; d[v]=d[u]+eg[i].dis; dfs(v,u); } } void dfs2(int u,int fa) { for(int i=head[u];i;i=eg[i].nxt) { int v=eg[i].to; if(fa==v)continue; d[v]=d[u]+eg[i].dis; dfs2(v,u); } } void dfs3(int u,int fa) { for(int i=head[u];i;i=eg[i].nxt) { int v=eg[i].to; if(fa==v)continue; d[u]=eg[i].dis; dfs3(v,u); } } int dfs4(int u,int fa) { s[u].clear(); for(int i=head[u];i;i=eg[i].nxt) { int v=eg[i].to; if(fa==v)continue; int val=dfs4(v,u)+eg[i].dis; if(val>=ml)ans++; else s[u].insert(val); } int ma=0; while(!s[u].empty()) { if(s[u].size()==1)return max(ma,*s[u].begin()); it=s[u].lower_bound(ml-*s[u].begin()); if(it==s[u].begin()&&s[u].count(*it)==1)it++; if(it==s[u].end()) { ma=max(ma,*s[u].begin()); s[u].erase(s[u].find(*s[u].begin())); } else{ ans++; s[u].erase(s[u].find(*s[u].begin())); s[u].erase(s[u].find(*it)); } } return ma; } int check(int w) { int now=0,cnt=0; for(int i=1;i<=n-1;i++) { now+=d[i]; if(now>=w){now=0;cnt++;} } if(now>=w)cnt++; if(cnt>=m)return 1; return 0; } int check2(int w) { ans=0; ml=w; dfs4(1,0); if(ans>=m)return 1; return 0; } int cmp(int a,int b){return a>b;} int main() { //freopen("track.in","r",stdin);freopen("track.out","w",stdout); cin>>n>>m; int flg=0,tag=0; for(int i=1;i<n;i++){cin>>a>>b>>c;if(b!=a+1)flg=1;if(a!=1)tag=1;adde(a,b,c);adde(b,a,c);} if(m==1) { dfs(1,0); int maxl=-1; for(int i=1;i<=n;i++) if(maxl<d[i]) {maxl=d[i];tmp=i;} memset(d,0,sizeof(d)); dfs2(tmp,0); maxl=-1; for(int i=1;i<=n;i++) maxl=max(d[i],maxl); cout<<maxl;return 0; } if(!flg) { dfs3(1,0); int l=0,ans,r=0x3f3f3f3f; while(l<=r) { int mid=(l+r)>>1; if(check(mid)){ans=mid;l=mid+1;} else r=mid-1; } cout<<ans;return 0; } if(!tag) { for(int i=head[1];i;i=eg[i].nxt)d[eg[i].to-1]=eg[i].dis; sort(d+1,d+n,cmp); int minn=0x3f3f3f3f; for(int i=1;i<=m;i++)minn=min(minn,d[i]+d[2*m-i+1]); cout<<minn;return 0; } int l=0,ans,r=0x3f3f3f3f; while(l<=r) { int mid=(l+r)>>1; if(check2(mid)){ans=mid;l=mid+1;} else r=mid-1; } cout<<ans; }