• 51nod1423 最大二“货” 单调队列


    51nod1423 最大二“货”
    单调队列

    考虑 次大值 在 最大值前面的情况 这样出栈 时 就可以两个数 异或一下 维护一个单调递减的单调队列
    出栈的数当做 次大值 进栈的数当做最大值
    但是这样只考虑了一种情况 还要考虑 最大值在次大值前面的 情况,这样只要反向在做一遍就行了 ,然后取最大值

    这题还有个重要的条件就是 没有两个数相等的情况 如果有的话次大值和较大值就麻烦了

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <string>
     6 #include <algorithm>
     7 #include <iomanip> 
     8 #include <iostream> 
     9 using namespace std ; 
    10 
    11 const int maxn = 1e5 + 11 ; 
    12 int n,top,ans,t ;
    13 int a[maxn],st[maxn] ;  
    14 
    15 inline int read() 
    16 {
    17     int x = 0 , f = 1 ; 
    18     char ch = getchar() ; 
    19     while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ; } 
    20     while(ch>='0'&&ch<='9') { x = x * 10+ch-48 ; ch = getchar() ; }
    21     return x * f ; 
    22 }
    23 
    24 inline void solve() 
    25 { 
    26     for(int i=1;i<=n;i++) 
    27     {
    28         while(top&&st[ top ] <= a[ i ] )   //其实每一个数都是不同的  ,所以等号是不必要的  
    29         {
    30             ans = max( ans,a[ i ] ^ st[ top ] ) ; 
    31             top-- ; 
    32         }
    33         st[++top] = a[ i ] ; 
    34     }
    35 }
    36 
    37 int main() 
    38 {
    39     while(~scanf("%d",&n)) 
    40     {
    41         ans = -1 ; 
    42         for(int i=1;i<=n;i++) a[ i ] =read() ; 
    43         solve() ; 
    44         for(int i=1,zz = n/2;i<=zz;i++) { t = a[ i ]; a[ i ] = a[ n-i+1 ] ; a[ n-i+1 ] = t ; } 
    45         solve() ; 
    46         printf("%d
    ",ans) ; 
    47     } 
    48     
    49     return 0 ; 
    50 }

      

  • 相关阅读:
    Poj(1459),最大流,EK算法
    Poj(3259),SPFA,判负环
    HDU(3790),最短路二级标准
    Poj(2349),最小生成树的变形
    CSUFT2016训练赛
    NYOJ(21),BFS,三个水杯
    Poj(3687),拓扑排序,
    Poj(2367),拓扑排序
    HDU(1856),裸的带权并查集
    HDU(1572),最短路,DFS
  • 原文地址:https://www.cnblogs.com/third2333/p/7106284.html
Copyright © 2020-2023  润新知