範測圖示:
0 1 2 3 4 5 6 7 8 9
========| . . . . . 0 [0 4] 1種方法
============| . . . 1 [0 6] 1+1 = 2種方法
. . . . ====| . . . 2 [4 6] 1種方法
. . . ========| . . 3 [3 7] 1+2+1 = 4種方法
. . . . . ========| 4 [5 9] 2+1+4 = 7種方法
DP轉移:
搭上一班公車後必須到終點站,下車後可以任意挑選一班會通過該站的公車,從中途上車。
計算邏輯:
停在0站有1種方法
第0班次 0->4 有1種方法, 第1~3班次的方法數各+1
第1班次 0->6 有2種方法(從0站、搭完第0班次後從4站), 第3~4班次的方法數各+2
第2班次 4->6 有1種方法(搭完第0班次後從4站), 第3~4班次的方法數各+1
第3班次 3->7 有4種方法(第0~2班次的方法總和), 第4班次的方法數+4
第4班次 5->9 有7種方法(第1~3班次的方法總和), 停在9站的方法數為7, 即為所求
實作方法:
首先,根據終點排序後就會出現單調性,就可以更新區間。
但先別急著砸線段樹!只要將各終點站的方法數做前綴和,就能更新、查詢區間了。
查詢區間前綴和,則是當前起點s對先前的終點站們二分搜,再由前綴和算區間,就能找到[s, f)區間內的方法數總和,再附上當前終點站f,累加進前綴和就好了。
需要注意的是方法總和只能算[s ,f)區間,不能重複算到終點站同為f的。(python的話可以用itertools.groupby輕鬆解決:D)