2018.08.08【2018提高组】模拟A组题解 城市猎人

T3:

城市猎人

题目描述:

有n个城市,标号为1到n,修建道路花费m天,第i天时,若gcd(a,b)=m-i+1,则标号为a的城市和标号为b的城市会建好一条直接相连的道路,有多次询问,每次询问某两座城市最早什么时候能连通。

输入

第一行输入三个正整数n,m,q,其中q表示询问个数。
接下来q行,每行两个正整数x,y,表示询问城市x和城市y最早什么时候连通。

输出

输出q行,每行一个正整数,表示最早连通的天数

样例输入

Input 1
8 3 3
2 5
3 6
4 8
Input 2
25 6 1
20 9
Input 3
9999 2222 2
1025 2405
3154 8949

样例输出

Output 1
3
1
2
Output 2
4
Output 3
1980
2160

【数据范围】

对于40%的数据,n≤ 1000,q<=100000
对于100%的数据,1 ≤ n,q≤ 100000,1<=m<=q

题解:并查集

暴力枚举i(i<=m),枚举j(j<=n div m-i+1),将i与i*j,即i的倍数编号的城市联通。

两个城市联通相当于它们所在的那棵树联通了,将两棵树的根相连即可。

如果已经联通了就不必再连了。

每个点多存一个变量,表示它向它的父亲连的那条边的时间。

因为要查询时间,所以我们可以不路径压缩。

le[i]表示以i为根的子树的层数,即秩。每次合并时将秩大的向秩小的连边。

再将秩小的秩更新。

设秩大的根为o,秩小的根为p,len[p]=len[o]+1

因为每次层数只会+1,所以最后层数也只有大概18层左右(这里就不证了)

查询时直接将x和y暴力向父亲跳,找lca,记录路径上权值最大的边即可。

你可能感兴趣的:(比赛TJ,并查集)