二维ST处理RMQ

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;
}

猜你喜欢

转载自www.cnblogs.com/reshuffle/p/12362083.html