最大數(線段樹 單調棧)

2022-09-22 23:00:25 字數 1220 閱讀 6487

寫線段樹的話太裸了,但是題意非常難搞,認真讀題:其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對乙個固定的常數d取模,將所得答案插入到數列的末尾。–>重新賦值

從題解上看到一種單調棧的寫法覺得非常巧妙

利用了題目的特性:每次都是在最後詢問,用單調棧維護,開兩個棧乙個儲存下標,乙個儲存他的值,在插入的時候把棧中比這個值小的都彈出,查詢時二分答案即可

線段樹//並將所得結果對乙個固定的常數d取模,將所得答案插入到數列的末尾

#include

#include

#include

using namespace std;

const int maxn=1e6;

const int inf=1e9;

int n,mod,last;

char opt[10];

struct nodetree[maxn<<1|1];

void pushup(int rt)

void change(int x,int c,int l,int r,int rt)

int mid=(l+r)>>1;

if (x<=mid) change(x,c,l,mid,rt<<1);

else change(x,c,mid+1,r,rt<<1|1);

pushup(rt);

}int ques(int l,int r,int l,int r,int rt)

int main()

last=ques(sz-x+1,sz,1,n,1);

printf("%d\n",last);}}

return 0;

}單調棧

#include

#include

#include

using namespace std;

const int maxn=1e6;

const int inf=1e9;

int n,mod,zhan[maxn][2],top,last,sz;

char opt[10];

void change(int x)

int ques(int x,int l,int r)

return zhan[l][1];

}int main()

last=ques(sz-x+1,1,top);

printf("%d\n",last);}}

return 0;

}

線段樹 最大數

給定乙個正整數數列 a1,a2,an,每乙個數都在 0 p 1 之間。可以對這列數進行兩種操作 新增操作 向序列後新增乙個數,序列長度變成 n 1 詢問操作 詢問這個序列中最後 l 個數中最大的數是多少。程式執行的最開始,整數序列為空。寫乙個程式,讀入操作的序列,並輸出詢問操作的答案。輸入格式 第一...

LeetCode 321 拼接最大數 單調棧

該題的本質即為從兩個陣列中挑選 k 個元素,並且使拼接後的結果的字典序最大。要使陣列的字典序最大,則需要保證從左到右的每乙個位置的值盡可能的大,即單調遞減。列舉所有 k 的組合情況,分別從兩個陣列中取 i j 個元素構成的最大陣列,然後再進行合併,最終保留最大值。在挑選指定個數的元素的過程中,若當前...

leetcode 321 拼接最大數(單調棧)

給定長度分別為 m 和 n 的兩個陣列,其元素由 0 9 構成,表示兩個自然數各位上的數字。現在從這兩個陣列中選出 k k m n 個數字拼接成乙個新的數,要求從同乙個陣列中取出的數字保持其在原陣列中的相對順序。求滿足該條件的最大數。結果返回乙個表示該最大數的長度為 k 的陣列。說明 請盡可能地優化...