1. 程式人生 > >【SPOJ GSS】數據結構套題

【SPOJ GSS】數據結構套題

題意 修改 組成 ss5 最大連續子序列 問題 log 如果 處理

SPOJ GSS1

題意:給一個序列以及一些詢問,每個是問\([l,r]\)中最大連續子序列和是多少。

思路:這個問題是以下問題的基礎

我們考慮用線段樹來解決這個問題。

首先我們來想想如果要求出最大連續子序列和需要什麽信息。

對於\([l,m)\)\([m,r)\)這兩個區間,我們需要將它們合並成\([l,r)\)這個區間。

那麽我們考慮分治地來解決這個問題。把問題分成三部分:

  • \([l,m)\)中的最大子序列和
  • \([m,r)\)中的最大子序列和
  • 左端點在\([l,m)\)內,右端點在\([m,r)\)內的最大子序列和。

其中前兩個部分可以遞歸處理,而第\(3\)個部分則需要記錄\([l,m)\)

的最大後綴和以及\([m,r)\)的最大前綴和,以便求出此部分的值。所以對每個節點維護\([l,r)\)的和、最大子序列和、最大前綴和、最大後綴和。

將值上推的時候這樣做:

  • 首先將\([l,r)\)的和設為\([l,m)\)的和加上\([m,r)\)的和。
  • 然後考慮最大前綴和(最大後綴和與之對稱,略):這個最大前綴和的結尾可能有兩種情況:
    • \([l,m)\)中,即\([l,m)\)的最大前綴和
    • \([m,r)\)中,即\([l,m)\)的和加上\([m,r)\)的最大前綴和
  • 然後最大子序列和就是\([l,m)\)的最大後綴和加上\([m,r)\)的最大前綴和。

然後就好辣。

SPOJ GSS3

題意:給一個序列以及一些詢問,每個是\(1)\)\(x\)這一位上的數改成\(v\)\(2)\)\([l,r]\)中最大連續子序列和是多少。

思路:這題比GSS1只是多了修改操作,而這只是單點修改,所以直接加上正常線段樹的\(update\)操作即可。

SPOJ GSS5

題意:給一個序列以及一些詢問,每個是問\(max\ \sum_{k=i}^ja_k(x_1\leq i\leq y_1,x_2\leq j\leq y_2,x_1\leq x_2,y_1\leq y_2)\)

思路:我們將\(y_1\)\(x_2\)的大小情況分兩類考慮:

  • \(y_1<x_2\)時,這兩個區間沒有任何交叉,所以答案肯定是\([x_1,y_1]\)
    的最大後綴和加上\([y_1+1,x_2-1]\)的和加上\([x_2,y_2]\)的最大前綴和。
  • \(y_1\geq x_2\)時,這兩個區間的交叉是\([x_2,y_1]\)這段,那麽我們要分幾種情況考慮:
    • \(i\)\([x_1,x_2-1]\)裏,\(j\)\([x_2,y_1]\)裏:\([x_1,x_2-1]\)的最大後綴和加上\([x_2,y_1]\)的最大前綴和。
    • \(i\)\([x_1,x_2-1]\)裏,\(j\)\([y_1+1,y_2]\)裏:\([x_1,x_2-1]\)的最大後綴和加上\([x_2,y_1]\)的和加上\([y_1+1,y_2]\)的最大前綴和。
    • \(i\)\([x_2,y_1]\)裏,\(j\)\([i,y_1]\)裏:\([x_2,y_1]\)的最大連續子序列和。
    • \(i\)\([x_2,y_1]\)裏,\(j\)\([y_1+1,y_2]\)裏:\([x_2,y_1]\)的最大後綴和加上\([y_1+1,y_2]\)的最大前綴和。
  • 然後取\(max\)就好辣。
SPOJ GSS7

題意:給一棵樹以及一些詢問,每個是\(1)\)\(a\rightarrow b\)的路徑上每一個點都賦成\(c\)\(2)\)\(a\rightarrow b\)的路徑上每一個點組成的序列的最大連續子序列和。

思路:樹鏈剖分都出來了。。。

先看第一個詢問。

這個詢問還是比較普通的。。。

套個樹鏈剖分的模板做一下就行了,不過線段樹中還要加上區間修改的操作。其實也蠻簡單的:)

然後我們考慮第二個詢問。

首先這個不可以套模板了。。。

最大連續子序列和不是個可以分段搞的東西。。。

然後放棄想了想發現我們可以\(O(log^2)\)地做!!!

首先我們按照正常步驟來把這條路徑上所有的重鏈作為一個個區間,記為\(A_{1..m}\)

然後我們根據(da)樹鏈剖分(le)復雜度(ge)的證明(biao)發現\(m\)不會超過\(O(log\ n)\)

所以開心地暴力。。。

枚舉區間開頭\(l\),區間結尾\(r\),那麽就是\(\sum_{i=l+1}^{r-1}A_i\)的和加上\(A_l\)的最大後綴和加上\(A_r\)的最大前綴和。

還有一種情況就是答案就在\(A_i\)中,即\(A_i\)的最大連續子序列和。

搞死我了。。。寫了\(5K\)。。。

【SPOJ GSS】數據結構套題