题目传送门: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][j−1] 即可
复杂度是 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=1∑qai)×64n ,可以通过此题。