演算法零
$n,m \le 100, q \le 10$ 的話,直接給網格中的每乙個格點都建乙個點,然後該怎麼最短路就怎麼最短路,該怎麼並查集+bfs就怎麼並查集+bfs。
複雜度 $o(qnm)$,可以拿下前30分。
演算法一
$n\le 10^5, m = 1, q\le 10^5$ 的話,我們可以直接預處理出 $(1,1)-(1,i)$ 的距離以及 $(1,i)-(1,n)$ 的距離,然後就列舉走的方式 $i-j$ 或者 $j-n-1-i$ 就可以啦。
複雜度 $o(n + q)$,結合演算法零可以拿下50分。
演算法二
$n,m\le 10^5, q\le 10^5$ 的話,我們發現我們可以突破維度的界限,把每一維拆開分別考慮,最後的答案就是每一維的答案的和。
這為啥是對的呢?
對於 $a_i \neq a_$,無論 $b_j$ 取啥值,你從 $(i,j)$ 穿越到 $(i+1,j)$ 的時候,都必然會花費等待時間;否則如果 $a_i = a_$ 的話,就必然不會花費等待時間。所以一條路線的總等待時間可以拆分成各個維度的等待時間的和。
然後這個問題就變成一維問題啦,直接用演算法一的搞法就可以了。
複雜度 $o(n + m + q)$,可以拿下100分。
至於**的話,uoj 上一大把一大把的呀。。。