COJ 1003 WZJ的数据结构(三)ST表

WZJ的数据结构(三)
难度级别:B; 运行时间限制:3000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

请你设计一个数据结构,完成以下功能:

给定一个大小为N的整数组A,M次询问。每次询问给你i,j两个参数,求Ai至Aj中最大的数。

输入
第一行为两个正整数N,M。
第二行为N个整数Ai。
接下来M行为询问。 
输出
对于每个询问输出答案。 
输入示例
6 5
1 -2 3 4 -6 7
1 2
1 1
1 5
1 6
4 6
输出示例
1
1
4
7
7
其他说明
1<=N<=10000
1<=M<=1000000
-10^9<=Ai<=10^9
1<=L<=R<=N

ST表是处理RMQ问题中询问较多的利器。注意初始化的log[0] = -1,同时记得init(现在我都不敢写成函数了要不肯定忘。。。)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(' ')
 8 #define ENT putchar('
')
 9 using namespace std;
10 const int maxn=100000+10,inf=-1u>>1;
11 int d[maxn][20],Log[maxn],n,Q;
12 inline int read(){
13     int x=0,sig=1;char ch=getchar();
14     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
15     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
16     return x*=sig;
17 }
18 inline void write(int x){
19     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
20     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
21     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
22 }
23 int query(int x,int y){
24     int k=Log[y-x+1];
25     return max(d[x][k],d[y-(1<<k)+1][k]);
26 }
27 void init(){
28     n=read();Q=read();Log[0]=-1;
29     for(int i=1;i<=n;i++) d[i][0]=read(),Log[i]=Log[i>>1]+1;
30     for(int j=1;(1<<j)<=n;j++)
31         for(int i=1;i+(1<<j)-1<=n;i++)
32             d[i][j]=max(d[i][j-1],d[i+(1<<j-1)][j-1]);
33     return;
34 }
35 void work(){
36     int x,y;
37     while(Q--){
38         x=read();y=read();
39         write(query(x,y));ENT;
40     }
41     return;
42 }
43 void print(){
44     return;
45 }
46 int main(){init();work();print();return 0;}
原文地址:https://www.cnblogs.com/chxer/p/4419463.html