void get_rmp () { for (int i=1;i<=n;i++) r[i][0]=a[i];// a[] 原数组 for (int j=1;(1<<j)<=n;j++) for (int i=1;i+(1<<j)-1<=n;i++) r[i][j]=min(r[i][j-1],r[i+(1<<(j-1))][j-1]); return ; } int query_rmp(int x,int y) { // 区间 (x ,y)最下值 if (x>y) swap(x,y);int k=0; while ( y-x+1>=(1<<(1+k)) ) k++; return min (r[x][k],r[y-(1<<k)+1][k]); }
位运算真是好哈
r[i][j]// 以i开始长度为(2^j)的数组的最小值
递推关系 r[i][j]=r[i][j]=min(r[i][j-1],r[i+(1<<(j-1))][j-1]);
抓住青春的尾巴。。。