[关闭]
@hhzhhzhhz 2019-10-06T13:09:13.000000Z 字数 670 阅读 369

(RMQ)区间最值问题——ST表


  构建ST表相当于是一个DP的过程在【l,r】中选取两段(部分重合或首尾相接)的两段中的最大值中选取最值;


板子题:vijos P1514 天才的记忆
直接上代码了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int f[200010][20];
  5. int main() {
  6. scanf("%d",&n);
  7. for(int i=1; i<=n; i++) {
  8. scanf("%d",&f[i][0]);
  9. }
  10. int m,l,r;
  11. int k=2;
  12. for(int j=1; j<=19; j++) {
  13. for(int i=1; i+k-1<=n; i++) {
  14. f[i][j]=max(f[i][j-1],f[i+k/2][j-1]);
  15. }
  16. k*=2;
  17. }
  18. scanf("%d",&m);
  19. for(int i=1; i<=m; i++) {
  20. scanf("%d%d",&l,&r);
  21. int t=log(r-l+1)/log(2);//换底公式
  22. int x=pow(2,t);
  23. printf("%d\n",max(f[l][t],f[r-x+1][t]));//将没有表示过的【l,r】,变为已经表示过的两端
  24. }
  25. return 0;
  26. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注