题解 P5068 [Ynoi2015] 我回来了

题目传送门:P5068

Description

珂朵莉给你一个无向图,每次查询的时候给一堆二元组 ( x i , y i ) (x_i,y_i) (xi,yi)

求图中有多少个点 u u u 与至少一个这次询问给出的二元组 ( x i , y i ) (x_i,y_i) (xi,yi) 满足 d i s t ( u , x i ) < = y i dist(u,x_i)<=y_i dist(u,xi)<=yi d i s t dist dist 表示这两个点在图中的距离

如果不连通 d i s t = i n f dist = inf dist=inf

Solution

考虑用 b i t s e t bitset bitset 来维护里一个点距离小于 y i y_i yi 的点,那么答案就是一堆 b i t s e t bitset bitset 或起来后二进制位中 1 1 1 的个数

这样我们只要令 f [ i ] [ j ] f[i][j] f[i][j] 表示距离 i i i 点距离小于 j j j 的点,便可以高效求出答案。

先枚举起点 u u u ,因为边权为 1 1 1 ,所以只需要做一次 bfs 。

对于 i i i 这个点,假设它到 u u u 的距离为 d i s i dis_i disi ,那么我们就将 f [ u ] [ d i s i ] f[u][dis_i] f[u][disi] 的第 i i i 位设为 1 1 1 ,最后从小到大把 f [ u ] [ j ] f[u][j] f[u][j] 或上 f [ u ] [ j − 1 ] f[u][j - 1] f[u][j1] 即可

复杂度是 n 3 64 + ( ∑ i = 1 q a i ) × n 64 \frac{n^3}{64} + (\sum\limits_{i=1}^{q}a_i)\times\frac{n}{64} 64n3+(i=1qai)×64n ,可以通过此题。

Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值