題目大意:給出 x 軸上的 n 個點,每個點都有一個位置和一個速度,每個點會根據(jù)速度在 x 軸上移動,現(xiàn)在規(guī)定dis( x , y )為點 x 和點 y 在移動過程中的最小距離,我們需要求出
題目分析:比賽時看到這個題知道是可以切的一道題,但沒想到給復(fù)雜化了,在推出結(jié)論和公式后選擇了用不太熟悉的主席樹去實現(xiàn),導(dǎo)致最后時間到了也沒有debug出來,賽后補(bǔ)題時發(fā)現(xiàn)用線段樹就可以維護(hù)(許多大神們都用樹狀數(shù)組維護(hù)的,但我不太會樹狀數(shù)組,還是用比較萬能的線段樹吧),因為題目給出的點都是基于 x 軸上的,所以我們不妨先對其坐標(biāo)排個序,然后有個很顯然的結(jié)論,那就是假設(shè)pos[ i ] < pos[ j ]:
當(dāng)speed[ i ]<=speed[ j ]時,dis( i , j )為pos[ j ] - pos[ i ]
當(dāng)speed[ i ]>speed[ j ]時,dis( i , j )為 0
這樣一來,遍歷每個點 i ,對答案有貢獻(xiàn)的點無非就是位置在點 i 之前,且速度小于等于speed[ i ]的點,而貢獻(xiàn)就是其距離差之和了,可以利用前綴和輕松求出,設(shè)cnt為速度小于等于speed[ i ]的點的個數(shù),sum為這cnt個點的坐標(biāo)之和,那么貢獻(xiàn)就是speed[ i ] * cnt - sum了,線段樹維護(hù)一下就好了,為了方便傳參,我自己定義了一個結(jié)構(gòu)體代替了pair