很诡异地一道题,你看他问的是是否存在距离\(d\in [dist,1.1dist]\)的路径.
你想一下这个
\(1.1\)是个啥.好像不知道,先考虑暴力叭.
暴力你就
\(bfs\),让点重复入队就好了,每个点维护一个
\(set\),查询直接
\(lower\_bound\)即可.
\(Code:\) #include #include #include #include #include #include #include #include #include #include #include
然后我们发现,这个玩意儿的瓶颈在于转移的时候状态太多了.
然后我们考虑优化这个东西.
我们发现,如果说有三个距离
\(x,y,z\)满足以下条件:
\[\cfrac{z}{1.1}<x<y<z\] 那么
\(y\)就是没用的,显然答案的存在性不会因为缺少
\(y\)而改变.
于是我们每次合并两个距离集合(即上述代码的转移,本质是两个距离集合的合并)就可以把这些
\(y\)踢掉,使用类似于归并排序的思路即可解决.
这样你可能会认为还是会
\(TLE\),但实际上它的复杂度是对的,为什么呢?
因为
\(1.1^{450}\)远远大于了所有权值的总和
\(10^{18}\),也就是说一个点最多同时有
\(450\)个状态被保留.
每次合并就是
\(\Theta(450)\)的,查询随意,怎么搞都能过.
\(Code:\) #include #include #include #include #include #include #include #include #include #include #include