【模板】二维rmq

来源:互联网 发布:网络订餐食品安全现状 编辑:程序博客网 时间:2024/05/01 09:21

前言

某次遇到一题需要使用,于是便补充一下。

二维rmq

就是在一个静态矩阵中询问多个子矩阵最值的问题。

具体来说我们可以设状态fi,j,k,l,表示左上角(i,j),右下角(i+2k1,j+2l1)的矩阵的最值。

我们将k0枚举到log2nl0枚举到log2m,然后枚举一个合法的点(i,j),然后对于l=0的情况就是一维rmq,当l0时,有转移式:

fi,j,k,l=max{fi,j,k,l1fi,j+2l1,k,l1

然后对于查询,因为是询问矩阵,所以要查询四种情况,具体来说如下:

如果查询矩阵左上角为(x1,y1),右下角为(x2,y2)

p=log2(x2x1+1),q=log2(y2y1+1)

那么:

ans=maxfx1,y1,p,qfx1,y12q+1,p,qfx12p+1,y1,p,qfx12p+1,y12q+1,p,q

Code

const int N=1000;int f[11][11][N][N];int a[N][N];int n,m;void pre(){    fo(i,1,n)    fo(j,1,m) f[0][0][i][j]=a[i][j];    int p=int(log2(n)),q=int(log2(m));    fo(k,0,p)    fo(l,0,q)    if(k+l)    fo(i,1,n-(1<<k)+1)    fo(j,1,m-(1<<l)+1)    if (!l) f[k][l][i][j]=max(f[k-1][l][i][j],f[k-1][l][i+(1<<(k-1))][j]);    else f[k][l][i][j]=max(f[k][l-1][i][j],f[k][l-1][i][j+(1<<(l-1))]);}int rmqmax(int x1,int y1,int x2,int y2){    int p=int(log2(x2-x1+1)),q=int(log2(y2-y1+1));    return max(max(f[p][q][x1][y1],f[p][q][x2-(1<<p)+1][y1]),max(f[p][q][x1][y2-(1<<q)+1],f[p][q][x2-(1<<p)+1][y2-(1<<q)+1]));}
1 0
原创粉丝点击