void initRMQ(int n,int m)
{
// leave out init a[i][j][0][0]
int Maxn=(int)log2(n);
int Maxm=(int)log2(m);
FOR(ii,0,Maxn)
{
FOR(jj,0,Maxm)
{
if (ii+jj)
{
FOR(i,1,n) if (i+(1<<ii)-1<=n)
{
FOR(j,1,n) if (j+(1<<jj)-1<=n)
{
if (ii==0)
{
f[i][j][ii][jj]=max(f[i][j][ii][jj-1],f[i][j+(1<<(jj-1))][ii][jj-1]);
}
else
{
f[i][j][ii][jj]=max(f[i][j][ii-1][jj],f[i+(1<<(ii-1))][j][ii-1][jj]);
}
}
}
}
}
}
}
int getRMQ(int x1,int y1,int x2,int y2)//x1,y1:upleft
{
int k1=(int)log2((x2-x1+1));
int k2=(int)log2((y2-y1+1));
int tmp1=f[x1][y1][k1][k2];
int tmp2=f[x2-(1<<k1)+1][y2-(1<<k2)+1][k1][k2];
int tmp3=f[x2-(1<<k1)+1][y1][k1][k2];
int tmp4=f[x1][y2-(1<<k2)+1][k1][k2];
int maxx=max(max(tmp1,tmp2),max(tmp3,tmp4));
return maxx;
}
二维ST处理RMQ
猜你喜欢
转载自www.cnblogs.com/reshuffle/p/12362083.html
今日推荐
周排行