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; }