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;
    }
  • 相关阅读:
    ASP抽取数据的执行效率(转)
    gridview中onmouseover的效果
    ASP中类的调用(转)
    PHP 类 的使用[实例讲解]
    常用PHP编辑器介绍
    cookies的存入
    如何为gridview控件里的“删除”列添加一个确认对话框?
    windows下忘记mysql超级管理员root密码的解决办法(转)
    记Visual Studio 2010一次令人崩溃的经历
    sql server 2005系统视图sys.sysobjects和sys.all_objects,sys.objects,三者之间有什么区别?
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/11409393.html
Copyright © 2011-2022 走看看