[NOI2019] 弹跳
题意: 给你平面上的$n$个点,共有$m$个弹跳装置。 每个弹跳装置可以从点$p_{i}$以$t_{i}$的代价跳到矩形$(L_{i},D_{i}),(R_{i},U_{i})$中的任何一个点。 现在请你对于每座城市求出从1号点跳到它的最小代价。 $n\leq 70000,m\leq 150000$。 题解: 看一眼就知道$KD-tree$优化建图,但如果把所有边都建出来就$MLE$了。 设原图上的点是实点,$KD-tree$上的点(代表一个实点和一个矩形)是虚点。 那么在$Dijkstra$到每个点的时候: 若是实点,在$KD-tree$上查找能连的虚点/实点并向其连带权边。 若是虚点,向它的两个儿子和它对应的实点连权为0的边。 时间复杂度$O(m\sqrt{n})$,空间复杂度$O(m)$(实际上只有优先队列可能达到这个空间,其他都是$O(n)$)。 没了。 不知道为什么有人写线段树。 代码: #include<bits/stdc++.h> #define maxn 200005 #define maxm 500005 #define inf 0x7fffffff #define ll long long #define rint register int #define debug(x) cerr<<#x<<": "<<x<<endl #define fgx cerr<<"-