AcWing 1273. 天才的记忆

从前有个人名叫 WNB,他有着天才般的记忆力,他珍藏了许多许多的宝藏。

在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以继承他的宝藏。

题目是这样的:给你一大串数字在你看过一遍之后,它便消失在你面前,随后问题就出现了,给你m 个询问,每次询问就给你两个数字,要求你瞬间就说出这段区间内的最大数。

一天,一位美丽的姐姐从天上飞过,看到这个问题,感到很有意思(主要是据说那个宝藏里面藏着一种美容水,喝了可以让这美丽的姐姐更加迷人),于是她就竭尽全力想解决这个问题。

但是,她每次都以失败告终,因为这数字的个数是在太多了!

于是她请天才的你帮他解决。如果你帮她解决了这个问题,可是会得到很多甜头的哦!

#include<bits/stdc++.h>
using namespace std;
const int N = 2000100,M = 18;
int n,m,f[N][M];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>f[i][0];
    for(int j=1;j<M;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
    cin>>m;
    while(m--)
    {
        int l,r;
        cin>>l>>r;
        int len=r-l+1;
        int k=log(len)/log(2);
        cout<<max(f[l][k],f[r-(1<<k)+1][k])<<endl;
    }
    return 0;
}

 

posted @ 2021-01-29 11:35  君与  阅读(63)  评论(0编辑  收藏  举报