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,记录路径上权值最大的边即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值