• TYVJ1460 旅行


    描述

    A国有n座城市,每座城市都十分美,这使得A国的民众们非常喜欢旅行。然而,A国的交通十分落后,这里只有m条双向的道路,并且这些道路都十分崎岖,有的甚至还是山路,只能靠步行。通过每条道路的长度、泥泞程度等因素,我们给每条道路评估一个“崎岖度”,表示通过这条道路的不舒适程度。
    从X城市经过若干条道路到达Y城市,我们称这次旅行的“代价”为所经过道路“崎岖度”的最大值。当然,如果从X城市到Y城市有多条路线,民众们会自觉选择“代价”最小的路线进行旅行。但是,A国的民众也是有脾气的,如果旅行的“代价”超过了他们的“忍耐度”,他们就不选择这个旅行了,甚至宁愿在家里宅着。
    现在A国的国王想进行若干次询问:给定民众的“忍耐度”,问还有多少对城市(X,Y)会存在旅行?请你对国王的每次询问分别给出回答。

    输入格式

    第1行三个正整数n、m、Q,分别表示城市数量、道路数量和询问次数。
    第2行到第m+1行每行三个正整数x、y、w,表示x号城市和y号城市之间有一条“崎岖度”为w的双向道路。
    第m+2行至第m+Q+1行,每行一个正整数k,表示询问中给定的“忍耐度”为k。

    输出格式

    共Q行,对于每次询问做出回答。

    测试样例1

    输入

    5 5 2 
    1 2 1 
    2 3 2 
    3 4 1 
    4 5 4 
    5 1 1 

    2

    输出


    10

    备注

    【样例说明】
    第一个询问:(1,2)、(1,5)、(2,5)、(3,4)。其中(2,5)的具体走法为:2-1-5
    第二个询问:(1,2)、(1,3)、(1,4)、(1,5)、(2,3)、(2,4)、(2,5)、(3,4)、(3,5)、(4,5)。其中(4,5)的具体走法为:4-3-2-1-5
    【数据规模】
    对于20%的数据满足n<=20,m<=40,Q<=40;
    对于40%的数据满足n<=1000,m<=2000,Q<=1000;
    对于60%的数据满足n<=3000,m<=6000,Q<=200000;
    对于100%的数据满足n<=100000,m<=200000,Q<=200000。其他数不超过10^9。
    【细节提示】
    1 给出的n个城市不一定全部互相连通,且两个城市之间可能存在多条道路,也可能存在某条边是从某城市出发回到他自己。
    2 对于询问的结果可能很大,请注意使用适当的类型存储。
     
    并查集预处理,二分忍耐度
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<vector>
    #include<queue>
    using namespace std;
    const int maxn = 300005;
    struct edge{
        int u;
        int v;
        int w;
    };
    bool judge(edge a,edge b){
        return a.w < b.w;
    }
    long long n,m,q,k,a[maxn],req[maxn],val[maxn],pa[maxn];
    edge g[maxn];
    void input(){
        cin>>n>>m>>q;
        for(int i = 1;i <= m;i++){
            scanf("%lld%lld%lld",&g[i].u,&g[i].v,&g[i].w);
        }
        sort(g+1,g+1+m,judge);
        for(int i = 1;i <= n;i++){
            pa[i] = i;
            a[i] = 1;
        }
    }
    int findf(int x){
        return x != pa[x] ? pa[x] = findf(pa[x]) : x;
    }
    void init(){
        int fa,fb;
        for(int i = 1;i <= m;i++){
            req[i] = g[i].w;
            fa = findf(g[i].u);
            fb = findf(g[i].v);
            if(fa != fb){
                val[i] = val[i-1] + a[fa] * a[fb];
                a[fb] += a[fa];
                pa[fa] = fb;
            }else{
                val[i] = val[i-1];
            }
        }
    }
    bool check(int t){
        return k >= req[t];
    }
    void div(){
        int lans = 0,rans = m,mans;
        while(lans <= rans){
            mans = (lans + rans) >> 1;
            if(check(mans)){
                lans = mans + 1;
            }else{
                rans = mans - 1;
            }
        }
        if(check(mans)) cout<<val[mans]<<endl;
        else cout<<val[mans-1]<<endl;
    }
    int main(){
        input();
        init();
        for(int i = 1;i <= q;i++){
            scanf("%lld",&k);
            div();
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Oracle登录报错-ORA-00119
    Oracle11g配置监听
    Python Turtle模块的简单应用
    Turtle模块基本方法和使用(画布)
    python+selenium自动化禅道登录测试
    Xlrd模块读取Excel文件数据
    Selenium原理
    Axure中的登陆界面和动画轮播
    SQL Server创建用户并分配权限
    EF实体框架创建方法
  • 原文地址:https://www.cnblogs.com/hyfer/p/5656613.html
Copyright © 2020-2023  润新知