并查集+二分 旅行

题目描述:

A国有n座城市,每座城市都十分美,这使得A国的民众们非常喜欢旅行。然而,A国的交通十分落后,这里只有m条双向的道路,并且这些道路都十分崎岖,有的甚至还是山路,只能靠步行。通过每条道路的长度、泥泞程度等因素,我们给每条道路评估一个“崎岖度”,表示通过这条道路的不舒适程度。

从X城市经过若干条道路到达Y城市,我们称这次旅行的“代价”为所经过道路“崎岖度”的最大值。当然,如果从X城市到Y城市有多条路线,民众们会自觉选择“代价”最小的路线进行旅行。但是,A国的民众也是有脾气的,如果旅行的“代价”超过了他们的“忍耐度”,他们就不选择这个旅行了,甚至宁愿在家里宅着。

现在A国的国王想进行若干次询问:给定民众的“忍耐度”,问还有多少对城市(X,Y)会存在旅行?请你对国王的每次询问分别给出回答。

Input

第1行三个正整数n、m、Q,分别表示城市数量、道路数量和询问次数。

第2行到第m+1行每行三个正整数x、y、w,表示x号城市和y号城市之间有一条“崎岖度”为w的双向道路。

第m+2行至第m+Q+1行,每行一个正整数k,表示询问中给定的“忍耐度”为k。

Output

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

Sample Input

5 5 2

1 2 1

2 3 2

3 4 1

4 5 4

5 1 1

1

2

Sample Output

4

10

HINT

【样例说明】

第一个询问:(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 对于询问的结果可能很大,请注意使用适当的类型存储。

题解:

对于任意两点之间来说,起作用的只有崎岖度最小的的那条链上的最长边;

所以考虑维护这样的边与图的关系;

对边从小到大排序,然后维护一个连通性的并查集;

那么如果令f[i]为忍耐度为第i小的边时的答案的话;

可以得到转移方程f[i]=f[i-1]-size[x]*(size[x]-1)/2-size[y]*(size[y]-1)/2+(size[x]+size[y])*(size[x]+size[y]-1)/2;

size[x]表示x所在连通块中的点数;

然后为了快速的处理询问,可以做一些预处理;

使边权和f数组下标相对应,这样就可以通过二分边权数组来得到答案;

时间复杂度O(mlogm+Qlogm);

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 110000
using namespace std;
typedef long long ll;
struct node
{
    int x,y,val;
}a[N<<1];
int f[N],len[N<<1];
ll ans[N<<1],size[N];
int find(int x)
{
    if(f[x]==x)
        return x;
    f[x]=find(f[x]);
    size[f[x]]+=size[x];
    size[x]=0;
    return f[x];
}
ll mul(ll x)
{
    return x*(x-1)/2;
}
int cmp(node a,node b)
{
    return a.val<b.val;
}
int main()
{
    int n,m,q,i,j,k,x,y,fx,fy;
    scanf("%d%d%d",&n,&m,&q);
    for(i=1;i<=m;i++)
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].val);
    for(i=1;i<=n;i++)
        f[i]=i,size[i]=1;
    sort(a+1,a+1+m,cmp);
    for(i=1;i<=m;i++)
    {
        x=a[i].x,y=a[i].y;
        len[i]=a[i].val;
        fx=find(x),fy=find(y);
        if(fx!=fy)
        {
            ans[i]=ans[i-1]-mul(size[fy])-mul(size[fx])+mul(size[fx]+size[fy]);
            f[fx]=fy;
            size[fy]+=size[fx];
            size[fx]=0;
        }
        else
            ans[i]=ans[i-1];
    }
    for(i=1;i<=q;i++)
    {
        scanf("%d",&k);
        printf("%lld\n",ans[upper_bound(len+1,len+1+m,k)-len-1]);
    }
    return 0;
}
时间: 2024-11-10 08:21:12

并查集+二分 旅行的相关文章

HDU 5441——Travel——————【并查集+二分查界限】

Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1313    Accepted Submission(s): 472 Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, he is tr

hdu 4750 Count The Pairs(并查集+二分)

Problem Description With the 60th anniversary celebration of Nanjing University of Science and Technology coming soon, the university sets n tourist spots to welcome guests. Of course, Redwood forests in our university and its Orychophragmus violaceu

hdu 3081 【二分匹配+并查集+删边||最大路+并查集+二分枚举】

Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2307    Accepted Submission(s): 792 Problem Description Presumably, you all have known the question of stable marriage match. A

hdu 3277 Marriage Match III【最大流+并查集+二分枚举】

Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1491    Accepted Submission(s): 440 Problem Description Presumably, you all have known the question of stable marriage match.

【BZOJ2594】水管局长加强版,LCT+并查集+二分查找位置

Time:2016.05.10 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: LCT维护路径最小值 倒叙处理询问,就相当于往图里面加边. 实时维护最小值,即最小生成树,可以参照魔法森林. 最初的最小生成树操作用kruskal 最蛋疼的是处理询问时你不知道要删除哪条边,这给kruskal带来很大麻烦,所以我们对原来的每一条边使其编号小的端点在前,大的在后,然后以左端点为第一关键字,右端点为第二关键字排序,记录下每个左端点的所在区间,然后就可以通过二分查找的方式来确定是哪条边了

HDU 3081 Marriage Match II(网络流+并查集+二分答案)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 题目: Problem Description Presumably, you all have known the question of stable marriage match. A girl will choose a boy; it is similar as the game of playing house we used to play when we are kids. W

1821. [JSOI2010]部落划分【并查集+二分】

Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的. 不过好消息是,聪聪得到了一份荒岛的地图.地图上标注了N个野人居住的地点(可以看作是平面上的坐标).我们知道,同一个部落的野人总是生活在附近.我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离.聪聪还获得了一个有意义的信息——这些野人总共

hdu 5652 India and China Origins 并查集+二分

India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description A long time ago there are no himalayas between India and China, the both cultures are frequently exchanged and are kept in

HDU 3461 Code Lock(并查集+二分求幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3461 A lock you use has a code system to be opened instead of a key. The lock contains a sequence of wheels. Each wheel has the 26 letters of the English alphabet 'a' through 'z', in order. If you move a