WZJ的数据结构(三) |
难度级别:B; 运行时间限制:3000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述 |
请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,M次询问。每次询问给你i,j两个参数,求Ai至Aj中最大的数。 |
输入 |
第一行为两个正整数N,M。 第二行为N个整数Ai。 接下来M行为询问。 |
输出 |
对于每个询问输出答案。 |
输入示例 |
6 51 -2 3 4 -6 71 21 11 51 64 6 |
输出示例 |
11477 |
其他说明 |
1<=N<=10000 1<=M<=1000000 -10^9<=Ai<=10^9 1<=L<=R<=N |
ST表是处理RMQ问题中询问较多的利器。注意初始化的log[0] = -1,同时记得init(现在我都不敢写成函数了要不肯定忘。。。)
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #define PAU putchar(' ') 8 #define ENT putchar('\n') 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< >1]+1;30 for(int j=1;(1< <=n;j++)31 for(int i=1;i+(1< <=n;i++)32 d[i][j]=max(d[i][j-1],d[i+(1<