單調棧 Vijos P1926 紫色的手鍊

2021-07-16 17:34:03 字數 1016 閱讀 3592

題目大意:

給n個數(n<=100 000),求任意區間的最大值異或次大值的最大值。

題目思路:

【模擬】【單調棧】

我們維護乙個嚴格單調遞減佇列,存放當前的數字,初始為前兩個數字。

每當加入新的元素時,依次與棧頭的元素比較,每次比較更新ans(當作該元素與棧頭元素構成的區間解,因為是嚴格單調遞減序列,所以這兩個元素是最大和次大的,否則棧頭已經被彈出),如果新的元素比棧頭元素大,就將棧頭元素彈出,重複以上的比較,更新解,彈出棧頭操作,直到結束。因為每個數字只會進棧出棧一次,所以時間複雜度是o(n)。

(說得有點拙計,如果沒看懂可以自己稍微畫畫樣例什麼的) 

//

//by cool***

//#include#include#include#include#include#include#include#include#include#include#include#define min(a,b) ((a)<(b)?(a):(b))

#define max(a,b) ((a)>(b)?(a):(b))

#define abs(a) ((a)>0?(a):(-(a)))

#define lowbit(a) (a&(-a))

#define sqr(a) (a)*(a)

#define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)

#define eps 1e-8

#define max 0x7f7f7f7f

#define inf 20000

#define pi 3.1415926535897

#define n 100004

using namespace std;

int n,m,lll,ans,cas;

int a[n];

int main()

printf("%d\n",ans);

} return 0;}

/*// //

*/

單調棧 模板 單調棧模板

biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...

單調佇列 單調棧

參考文章 單調佇列 poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106 m n n 106,m n n 106 m n 直接暴力求解複雜度在0 mn 可以考慮維護區間最值,單調佇列則是維護區間佇列的強大 單調佇列的定義 單調佇列實現的大致過程 1...

棧和佇列 單調佇列 單調棧

講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...