• 【NOIP2015】运输计划


    公元 2044 年,人类进入了宇宙纪元。

    L 国有 n 个星球,还有 n1 条双向航道,每条航道建立在两个星球之间,这 n1 条航道连通了 L 国的所有星球。

    小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之间不会产生任何干扰。

    为了鼓励科技创新, L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。

    在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后,这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的物流公司的阶段性工作就完成了。

    如果小 P 可以自由选择将哪一条航道改造成虫洞, 试求出小 P 的物流公司完成阶段性工作所需要的最短时间是多少?

    输入格式

    第一行包括两个正整数 n,m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。

    接下来 n1 行描述航道的建设情况,其中第 i 行包含三个整数 ai,bi 和 ti,表示第 i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。数据保证 1ai,bin 且 0ti1000

    接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j 个运输计划是从 uj 号星球飞往 vj号星球。数据保证 1ui,vin

    输出格式

    输出文件只包含一个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间。

    样例一

    input

    6 3
    1 2 3
    1 6 4
    3 1 7
    4 3 6
    3 5 5
    3 6
    2 5
    4 5
    
    

    output

    11
    
    

    explanation

    将第 1 条航道改造成虫洞: 则三个计划耗时分别为:11,12,11,故需要花费的时间为 12

    将第 2 条航道改造成虫洞: 则三个计划耗时分别为:7,15,11,故需要花费的时间为 15

    将第 3 条航道改造成虫洞: 则三个计划耗时分别为:4,8,11,故需要花费的时间为 11

    将第 4 条航道改造成虫洞: 则三个计划耗时分别为:11,15,5,故需要花费的时间为 15

    将第 5 条航道改造成虫洞: 则三个计划耗时分别为:11,10,6,故需要花费的时间为 11

    故将第 3 条或第 5 条航道改造成虫洞均可使得完成阶段性工作的耗时最短,需要花费的时间为 11

    限制与约定

    测试点编号n的取值m的取值约定
    1 =100 =1  
    2 =100 第 i 条航道连接 i 号星球与 i+1 号星球
    3  
    4 =2000 =1
    5 =1000 =1000 第 i 条航道连接 i 号星球与 i+1 号星球
    6 =2000 =2000
    7 =3000 =3000
    8 =1000 =1000  
    9 =2000 =2000
    10 =3000 =3000
    11 =80000 =1
    12 =100000
    13 =70000 =70000 第 i 条航道连接 i 号星球与 i+1 号星球
    14 =80000 =80000
    15 =90000 =90000
    16 =100000 =100000
    17 =80000 =80000  
    18 =90000 =90000
    19 =100000 =100000
    20 =300000 =300000

    时间限制:1s

    空间限制:256MB

    跪了。。。。。。。。。

    考场想了一个奇怪的树链剖分的做法,最后发现是有问题的。。。。。(希望能多拿点分)

    这道题真是水题。。。。。

    将边权附到出边的点权,二分答案,找出所有不符合题意的路径,这些路径上必须删至少一条边。算出这些链的交集,可以离线打标记,然后判判就行了。

    #include<cstdio>
    #include<cctype>
    #include<queue>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define rep(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define ren for(int i=first[x];i;i=next[i])
    using namespace std;
    inline int read() {
        int x=0,f=1;char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=getchar()) x=x*10+c-'0';
        return x*f;
    }
    const int maxn=300010;
    int n,m,first[maxn],next[maxn<<1],to[maxn<<1],dis[maxn<<1],e;
    void AddEdge(int u,int v,int w) {
        to[++e]=v;dis[e]=w;next[e]=first[u];first[u]=e;
        to[++e]=u;dis[e]=w;next[e]=first[v];first[v]=e;
    }
    int val[maxn],u[maxn],v[maxn],w[maxn],fa[maxn],siz[maxn],son[maxn],dep[maxn],dist[maxn];
    void dfs(int x) {
        dep[x]=dep[fa[x]]+1;siz[x]=1;
        ren if(to[i]!=fa[x]) {
            fa[to[i]]=x;dist[to[i]]=dist[x]+dis[i];
            dfs(to[i]);siz[x]+=siz[to[i]];
            if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
        }
    }
    int top[maxn];
    void build(int x,int tp) {
        top[x]=tp;if(son[x]) build(son[x],tp);
        ren if(to[i]!=fa[x]&&to[i]!=son[x]) build(to[i],to[i]);
    }
    int lca(int x,int y) {
        int f1=top[x],f2=top[y];
        while(f1!=f2) {
            if(dep[f1]<dep[f2]) swap(f1,f2),swap(x,y);
            x=fa[f1];f1=top[x];
        }
        return dep[x]<dep[y]?x:y;
    }
    int tot,mx2,A[maxn],B[maxn],C[maxn],LCA[maxn],cnt[maxn];
    int dfs2(int x) {
        ren if(to[i]!=fa[x]) cnt[x]+=dfs2(to[i]);
        if(cnt[x]==tot) mx2=max(mx2,val[x]);
        return cnt[x];
    }
    int check(int mid) {
        memset(cnt,0,sizeof(cnt));
        int mx=0;tot=mx2=0;
        rep(i,1,n) if(C[i]>mid) {
            mx=max(mx,C[i]);
            cnt[A[i]]++;cnt[B[i]]++;
            cnt[LCA[i]]-=2;tot++;
        }
        dfs2(1);
        return mx-mx2<=mid;
    }
    int main() {
        n=read();m=read();
        rep(i,2,n) {
            u[i]=read();v[i]=read();w[i]=read();
            AddEdge(u[i],v[i],w[i]);
        }
        dfs(1);build(1,1);
        rep(i,2,n) {
            if(dep[u[i]]>dep[v[i]]) val[u[i]]=w[i];
            else val[v[i]]=w[i];
        }
        int l=0,r=0,mid;
        rep(i,1,m) {
            A[i]=read();B[i]=read();
            r=max(r,C[i]=dist[A[i]]+dist[B[i]]-2*dist[LCA[i]=lca(A[i],B[i])]);
        }
        while(l<r) if(check(mid=l+r>>1)) r=mid; else l=mid+1;
        printf("%d
    ",l);
        return 0;
    }
    View Code
  • 相关阅读:
    iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    iOS NSArray数组过滤
    App Store2016年最新审核规则
    iOS 根据字符串数目,自定义Label等控件的高度
    iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
    Entity FrameWork 增删查改的本质
    EF容器---代理类对象
    Entity FrameWork 延迟加载本质(二)
    Entity FrameWork 延迟加载的本质(一)
    Entity FrameWork 增删查改
  • 原文地址:https://www.cnblogs.com/wzj-is-a-juruo/p/4950853.html
Copyright © 2020-2023  润新知