幸運子串行

2021-10-03 10:59:35 字數 944 閱讀 1166

牛牛得到乙個長度為n的整數序列v,牛牛定義一段連續子串行的幸運值為這段子序列中最大值和次大值的異或值(次大值是嚴格的次大)。牛牛現在需要求出序列v的所有連續子串行中幸運值最大是多少。請你幫幫牛牛吧。

第一行乙個整數n,即序列的長度。(2<= n <= 100000)

第二行n個數,依次表示這個序列每個數值v[i], (1 ≤ v[i] ≤ 10^8)且保證v[1]到v[n]中至少存在不同的兩個值。

這道題最重要的是求出序列中的最大值和最小值,考察一段特殊的序列,比如遞減序列6,5,4,3,有[6,5,4,3],[6,5,4],[6,5],[5,4,3],[5,4],[4,3]這些序列,但其實只需要計算[6,5],[5,4],[4,3]的值就可以了,因為這是遞減序列的前兩個數就是其最大值和次大值。那麼加入aj-ak是非增序列,ak+1了該序列的順序性,那麼從ak向前遍歷,直到找到第乙個am>ak+1,am到ak+1之間的某乙個數ai,ai—ak+1構成的序列的最大值和次大值就是ak+1,ai依次計算,而從aj到ai就不需要進行計算了,因為期間所有數都比ak+1大。那麼維持乙個stack棧,保留到某乙個數ai的非增序列,對於ai,將棧中所有小於ai的數全部出棧並與之計算,然後計算ai與第乙個大於ai的數aj的異或值,再將ai入棧,依次向後。

#include

#include

#include

using

namespace std;

stack<

int> stk;

intluckyone

(vector<

int>

& data,

int n)

stk.

push

(data[i]);

}}return maxv;

}int

main()

關於用棧來記錄一段序列的最值問題,還有類似的一道題,見

幸運序列(lucky)

lsy喜歡幸運數字,眾所周知,幸運數字就是數字位上只有4和7的數字。但是本題的幸運序列和幸運數字完全沒關係,就是乙個非常非常普通的序列。哈哈,是不是感覺被耍了,沒錯,你就是被耍了。lsy現在手上有乙個長度為n的幸運序列a,他想這樣子折騰這個序列 如果已經折騰了k次了,就結束,否則找到乙個最小的i,使...

子串行 子串

def foo num list 求陣列中最大子串行的和,子串行必須連續 length len num list max value 10000000000 tmp 0 for i in range length tmp max tmp num list i num list i max value...

子串行 子串

1 第一種思路模板是乙個一維的 dp 陣列 int n array.length int dp newint n for int i 1 i n i 例如 最長遞增子串行 在這個思路中 dp 陣列的定義是 在子陣列 array 0 i 中,我們要求的子串行 最長遞增子串行 的長度是 dp i 2 第...