zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    kotlin中值范围
    kotlin中集合
    kotlin数据解构
    Java 8 Lambda 表达式
    kotlin 之内联函数
    kotlin之函数的范围和泛型函数
    kotlin函数的参数和返回值
    kotlin 之单表达式函数
    kotlin使用中辍标记法调用函数
    kotlin之函数的基本用法
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/11409393.html
Copyright © 2011-2022 走看看