P5021 赛道修建

————————————————————————————————————————————---

补了一个坑,要学学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;
}
原文地址:https://www.cnblogs.com/SFWR-YOU/p/11409393.html