Tony's Log

Algorithms, Distributed System, Machine Learning

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Actually I think problem statement is somewhat misleading. No need to mention range [L, R] at all.

The intention is a variation to "Largest Rectangle" which is a classic stack problem on LeetCode.

But you need to run Largest Rectangle twice: increased and decreased.

#include <cmath>
#include <stack>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    int n; cin >> n;
    vector<int> in(n);
    for(int i = 0; i < n; i ++)
        cin >> in[i];
    
    int ret = 0;
    {
        in.push_back(0); 
        stack<int> stk;
        for (int i = 0; i < in.size(); i++)
        {
            if (stk.empty() || in[i] > stk.top())
            {
                stk.push(in[i]);
            }
            else
            {
                int lastV = stk.top(); stk.pop();
                if (!stk.empty())
                {
                    ret = std::max(ret, (lastV ^ stk.top()));            
                    //cout << lastV << "-" << stk.top() << "=" << (lastV ^ stk.top()) << endl;
                }
                i--;
            }
        }
        in.pop_back();
    }
    {
        
        stack<int> stk;
        in.insert(in.begin(), 0);
        for (int i = in.size() - 1; i >= 0; i --)
        {
            if (stk.empty() || in[i] > stk.top())
            {
                stk.push(in[i]);
            }
            else
            {
                int lastV = stk.top(); stk.pop();
                if (!stk.empty())
                {
                    ret = std::max(ret, (lastV ^ stk.top()));            
                    //cout << lastV << "-" << stk.top() << "=" << (lastV ^ stk.top()) << endl;
                }
                i++;
            }
        }
    }
    
    cout << ret << endl;
    return 0;
}
View Code
posted on 2015-11-23 15:49  Tonix  阅读(243)  评论(0编辑  收藏  举报