原题是CFdiv1的一道B题,虚假2000分,其实只是个单调栈板子。
题意:先求在一个任意连续区间里的最大值和次大值,求二者异或值。然后最终输出所有异或值的最大值。
思路:在任意区间里找到第一个比该位置数大的数,便是一个区间的最大值和次大值了,然后正序逆序各跑一遍,不然会有疏漏,最终单调栈维护O(n)解决问题即可。
AC代码
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
const int N = 1e5+4;
#define ll long long
ll l[N],r[N],a[N];
int main()
{
ll n;
cin>>n;
for(ll i