3月29日 自己的模板RMQ
#include<cstdio>
#include<cstring>
int n,s[1000][4],word[1000],N;
int Log(int x)
{
int c=1;
while(x!=1) x=x>>1,c++;
return c;
}
int max(int x,int y)
{
if(x>=y) return x;
else return y;
}
int main()
{
scanf("%d",&n),N=Log(n);
memset(s,0,sizeof(int));
memset(word,0,sizeof(int));
for(int i=1;i<=n;i++) scanf("%d",&word[i]);
for(int i=1;i<=n;i++) s[i][0]=word[i];
//这里调了很久的原因就是为了调试方便把数组开小了,刚刚超了一位,所以最后一位没有清零
for(int j=1;j<=N;j++)
for(int i=1;i<=n;i++)
if(i+(1<<j)-1<=n)//这里很迷的就是不大括号就会出错,这是什么鬼优先级啊
s[i][j]=max(s[i][j-1],s[i+(1<<(j-1))][j-1]);//式子写对了但切记要打括号
//查询的时候用循环比较方便,先把二进制的表打好了,因为一定是递减的,在循环里面从大往小的减,注意很可能出错的地方就是衔接的地方要记得加减1,然后取最大就Ok了
}
评论