const int maxn = 1000000+50;
const int minn = 50;
int n,m,arr[maxn];
int maxdp[maxn][minn],mindp[maxn][minn];
struct point{
int l,r;
}p[maxn];
void Create(int flag)
{ //flag = 0建立最大rmq,flag = 1最小
int i,j,t;
if (flag == 0)
{
for (i = 1; i <= n; ++i)
maxdp[i][0] = arr[i];
for (j = 1; (1<<j) <= n; ++j)
for (i = 1; i+(1<<j)-1 <= n; ++i)
{
t = i + ( 1 << (j-1) );
maxdp[i][j] = max(maxdp[i][j-1],maxdp[t][j-1]);
}
}
else
{
for (i = 1; i <= n; ++i)
mindp[i][0] = arr[i];
for (j = 1; (1<<j) <= n; ++j)
for (i = 1; i+(1<<j)-1 <= n; ++i)
{
t = i + ( 1 << (j-1) );
mindp[i][j] = min(mindp[i][j-1],mindp[t][j-1]);
}
}
}
int RMQ(int l,int r,int flag)
{ //flag = 0查询最大rmq,flag = 1最小
int k = (int)(log(r-l+1.0)/log(2.0));
if (flag == 0)
return max(maxdp[l][k],maxdp[r-(1<<k)+1][k]);
else
return min(mindp[l][k],mindp[r-(1<<k)+1][k]);
}
RMQ ST算法模板
最新推荐文章于 2024-08-13 15:14:16 发布