Maximum Xor Secondary(單調棧)
阿新 • • 發佈:2019-02-06
題意:
給一個長度為 n 的序列,元素不重複,求 max {a[i] ^ a[j]} (a[i] 和 a[j] 為某個區間中的最大值和次大值,區間長度任意)。
解題思路:
接上篇。
考慮雖然區間的個數為 O(n ^ 2) 的,但是很多區間的最大值和次大值是重複的。
類似的思路,考慮 a[i] 作為次大值時,向前能擴充套件到的最大值,也需要同樣向前找到第一個比它大的元素。
同樣維護一個單調棧,可以 O(n) 解決掉。
然後別忘了還要向後擴充套件一次。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 1e5 + 5; int n,a[N],s[N]; int solve() { int ret = 0 , top = 0; for(int i=0;i<n;i++) { while(top && a[s[top]] < a[i]) --top; if(top) ret = max(ret,a[s[top]] ^ a[i]); s[++top] = i; } return ret; } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); int ans = solve(); reverse(a,a+n); ans = max(ans,solve()); printf("%d\n",ans); return 0; }