【模板】二维rmq

前言

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

二维rmq

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

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

我们将 k 0枚举到 log2n l 0枚举到 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值