One Oier' s dawn

Posted bingoyes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了One Oier' s dawn相关的知识,希望对你有一定的参考价值。

专题复习-RMQ 问题

与众不同

#include <cstdio>
//#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a))
#define nR(a,b,c) for(register int a = (b); (a) >= (c); --(a))
#define Fill(a,b) memset(a, b, sizeof(a))
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b))

#define ON_DEBUGG

#ifdef ON_DEBUGG

#define D_e_Line printf("\n----------\n") 
#define D_e(x) cout << (#x) << " : " << x << endl
#define Pause() system("pause")
#define FileOpen() freopen("in.txt", "r", stdin)

#else

#define D_e_Line ;
#define D_e(x) ;
#define Pause() ;
#define FileOpen() ;

#endif
using namespace std;
struct ios
    template<typename ATP>inline ios& operator >> (ATP &x)
        x = 0; int f = 1; char ch;
        for(ch = getchar(); ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
        while(ch >= '0' && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar();
        x *= f;
        return *this;
    
io;

template<typename ATP>inline ATP max(ATP &a, ATP &b)
    return a > b ? a : b;

template<typename ATP>inline ATP min(ATP &a, ATP &b)
    return a < b ? a : b;



const int N = 200007;

int n;
namespace RMQ

int f[N][21], lg[N], bin[21], last[N * 10], a[N], pos[N];
inline void Prepare()
    bin[0] = 1;
    R(i,1,20) bin[i] = bin[i - 1] << 1;
    R(i,2,n) lg[i] = lg[i >> 1] + 1;

inline void Init()
    R(i,1,n)
        io >> a[i];
        a[i] += 1000000;
        pos[i] = max(pos[i - 1], last[a[i]] + 1);
        f[i][0] = i - pos[i] + 1;
        last[a[i]] = i;
    
    
    int t = lg[n];
    R(j,1,t)
        int maxx = n - bin[j] + 1;
        R(i,1,maxx)
            f[i][j] = max(f[i][j - 1], f[i + bin[j - 1]][j - 1]);
        
    

inline int Query(int l, int r)
    int t = lg[r - l + 1];
    return max(f[l][t], f[r - bin[t] + 1][t]);




int main()
//FileOpen();
//freopen("1.txt", "w", stdout);

    int m;
    io >> n >> m;
    RMQ::Prepare();
    RMQ::Init();
    while(m--)
        int L, R;
        io >> L >> R;
        ++L, ++R;
//      int l = L, r = R, P;
//      while(l <= r)
//          int mid = (l + r) >> 1;
//          if(RMQ::pos[mid] <= L)
//              l = mid + 1;
//              P = l;
//          
//          else
//              r = mid - 1;
//      
        int P = lower_bound(RMQ::pos + L, RMQ::pos + R + 1, L) - RMQ::pos;
        printf("%d\n", min(R - L + 1, max(P - L, RMQ::Query(P, R)))); // false : P - L + 1
    
    
    return 0;

以上是关于One Oier' s dawn的主要内容,如果未能解决你的问题,请参考以下文章