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