CodeForces 280B(單調棧)
CodeForces 280B Maximum Xor Secondary(單調棧)
Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1, x2, …, xk (k > 1) is such maximum element xj, that the following inequality holds: .
The lucky number of the sequence of distinct positive integers x1, x2, …, xk (k > 1) is the number that is equal to the bitwise excluding OR of the maximum element of the sequence and the second maximum element of the sequence.
You’ve got a sequence of distinct positive integers s1, s2, …, sn (n > 1). Let’s denote sequence sl, sl + 1, …, sr as s[l…r] (1 ≤ l < r ≤ n). Your task is to find the maximum number among all lucky numbers of sequences s[l…r].
Note that as all numbers in sequence s are distinct, all the given definitions make sence.
Input
The first line contains integer n (1 < n ≤ 105). The second line contains n distinct integers s1, s2, …, sn (1 ≤ si ≤ 109).
Output
Print a single integer — the maximum lucky number among all lucky numbers of sequences s[l…r].
Examples
Input
5
5 2 1 4 3
Output
7
Input
5
9 8 3 5 7
Output
15
Note
For the first sample you can choose s[4…5] = {4, 3} and its lucky number is (4 xor 3) = 7. You can also choose s[1…2].
For the second sample you must choose s[2…5] = {8, 3, 5, 7}.
- 題目大意:
給你一串數,定義了一個幸運數:在一個連續區間裡的最大值和次大值得異或值。讓你求這串數得最大得幸運數。 - 解題思路:
從左到右維護一個單調遞減棧,從右往左維護一個單調遞減棧。然後求出,每個點左邊比他大的第一個數的位置 r[i] 和右邊第一個比它大的位置 l[i],這樣每個點作為次大值點就確定了兩個區間,左邊一個右邊一個,然後我們遍歷一遍,找到最大的異或值點就行。 - 實現細節:
這個題不是很難 ,我覺得需要處理的細節的地方就兩個
1:左右端點要特判一下
if(l[i]!=n+1)
maxx=max(maxx,a[i]^a[l[i]]);
if(r[i]!=0)
maxx=max(maxx,a[i]^a[r[i]]);
2.我們只需要判斷 a[i]^a[l[i]] 和 a[i] ^ a[r[i]]就行,不需要判斷 a[l[i]] ^ a[r[i]].
- AC程式碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <cmath>
#define ll long long
using namespace std;
const int maxn=1e5+19;
int n;
int a[maxn];
int l[maxn];///右邊第一個比它大的數的位置
int r[maxn];///左邊第一個比它大的數的位置
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
stack<int> s;
stack<int> s2;
for(int i=n;i>=1;i--)
{
while(s.size()&&a[s.top()]<a[i])
s.pop();
if(s.empty())
l[i]=n+1;
else
l[i]=s.top();
s.push(i);
}
for(int i=1;i<=n;i++)
{
while(s2.size()&&a[s2.top()]<a[i])
s2.pop();
if(s2.empty())
r[i]=0;
else
r[i]=s2.top();
s2.push(i);
}
int maxx=-1;
for(int i=1;i<=n;i++)
{
if(l[i]!=n+1)
maxx=max(maxx,a[i]^a[l[i]]);
if(r[i]!=0)
maxx=max(maxx,a[i]^a[r[i]]);
}
cout<<maxx<<endl;
}