2

洛谷 P3865 【模板】ST 表 题解

题目描述

给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间内数字的最大值。

输入格式

第一行包含两个整数 N,M 分别表示数列的长度和询问的个数。

第二行包含 N 个整数(记为 a_i),依次表示数列的第 i 项。

接下来 M 行,每行包含两个整数 l_i,r_i 表示查询的区间为 [l_i,r_i]

输出格式

输出包含 M 行,每行一个整数,依次表示每一次询问的结果。

AC代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m;
 5 int f[100100][50];
 6 int l,r;
 7 
 8 int main()
 9 {
10     scanf("%d%d",&n,&m);
11     for (int i=1;i<=n;i++)
12         scanf("%d",&f[i][0]);
13     for (int j=1;(1<<j)<=n;j++)
14         for (int i=1;i+(1<<j)-1<=n;i++)
15             f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
16 
17     while (m--)
18     {
19         scanf("%d%d",&l,&r);
20         int k=log2(r-l+1);
21         int sum=max(f[l][k],f[r-(1<<k)+1][k]);
22         printf("%d\n",sum);
23     }    
24     return 0;
25 }

 

posted @ 2021-08-20 09:47  Zˇx  阅读(88)  评论(0)    收藏  举报
Live2D