CodeForces 280B(枚舉 + 單調棧應用)

題目鏈接

思路如下

這題噁心的枚舉任意區間的 最大值及次最大值 ,正常的操作是,是很難實現的,但偏偏有個 單調棧這個動西,能夠完成這個任務,跟單調隊列相似,有單調 遞增、遞減的棧,這一題我們需要維護的是:遞減棧。
對於這個單調遞減棧:指的是從 從棧的底部 ——> 到 棧頂 元素值逐漸遞減。

⚠️對於棧的push操作:

  • 棧爲空的時候:直接壓入元素
  • 棧不爲空的時候:1. 當所壓入的元素小於棧頂的元素的時候,直接壓入該元素 。。。。2.當所壓入的元素大於棧頂的元素的時候,如果這個時候,我們把這個元素直接壓入隊列了,那麼會破壞棧 的單調遞減性,所以我們應該把在棧內比我們將要壓入的元素大的 全部 彈出pop,然後在將該元素 壓入棧。

題解如下

#include<iostream>
#include<stack>
using namespace std;
const int Len = 1e5 + 5;
int ar[Len];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0; i < n; i ++)
        scanf("%d",&ar[i]);
    stack<int> st;

    st.push(ar[0]);
    int ans = -1;
    for(int i = 1; i < n; i ++)
    {
        while(! st.empty() && ar[i] > st.top())
        {
            ans = max(ans , ar[i]^st.top());
            st.pop();
        }
        if(! st.empty())
            ans = max(ans , st.top()^ar[i]);
        st.push(ar[i]);
    }
    printf("%d",ans);
    return 0;
}
發佈了113 篇原創文章 · 獲贊 174 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章