1. 程式人生 > >Getting over it with yylidiw -- 1

Getting over it with yylidiw -- 1

最大的 ongl 每一個 括號 技術 clas 直接 不變 blog

給n<=50000個longlong範圍內的可正可負的數字問下面式子的最大值:

$f(l,r)=(a_l,a_{l+1},...,a_{r-1},a_r)(\sum_{i=l}^{r}a_i-max(a_l,a_{l+1},...,a_{r-1},a_r))$。

註意到括號裏那坨區間和-區間最大值在區間gcd不變的前提下是區間越大越好的。才怪嘞,有負數。

枚舉右端點,註意到從這裏往左走gcd會下降最多log次,而且隨著右端點往右移動,這些下降的地點會不遞減,因此暴力平移這些下降的地點復雜度是$O(nlog_2Max)$的。

然後就需要詢問:一些以某處為右端點的區間的最大的$(\sum_{i=l}^{r}a_i-max(a_l,a_{l+1},...,a_{r-1},a_r))$。由於是枚舉右端點,那看看加進這個數字之後這些東西會怎麽變。

技術分享圖片

比如說要加進這個藍色的東西,現在要看所有以藍色點為右端點的區間和-Max的最大值怎麽變。這條線裏面每一個數字表示以這裏為左端點,藍色點為右端點的區間的區間和-Max的最大值。首先有一部分數字的最大值是會變化的,就看成紅色的那部分。紅色那部分左邊剩下的部分最大值不變,可以直接區間+藍色點數值。紅色部分會先加上這區間原本的Max,然後加上藍色點數值,然後再減去藍色點數值,也就是加上了原本Max。而區間加、維護原數字區間Max和維護這些(區間和-Max)的最大值的最大值都可以線段樹搞定。完。

Getting over it with yylidiw -- 1