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