Vijos 1926 紫色的手链

来源:互联网 发布:啪啪啪软件 编辑:程序博客网 时间:2024/03/29 20:29

【题意】求任意区间最大值异或次大值得最大值

【分析】

这道题比较新颖,给出了单调栈对区间最大、次大的应用。



【代码】

#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;int n,w[100010];int stk[100010];int res;int max(int i,int j){return i>j?i:j;}int main(void){scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&w[i]);for (int i=1;i<=n;i++){for (;stk[0]&&stk[stk[0]]<=w[i];) res=max(res,stk[stk[0]]^w[i]),stk[stk[0]--]=0;if (stk[0]) res=max(res,stk[stk[0]]^w[i]);stk[++stk[0]]=w[i];}printf("%d\n",res);return 0;}
【总结】

1.  对于最值与位运算的结合,①字典树②线段树 ③单调栈

2.  单调栈:解决区间的最大值、次大值的相关问题

3.  数学归纳的逆应用,例如本题假设到第i个位,已知可能作为左端点的集合,求解本位的情况



0 0