RMQ算法 - Sparse-Table
写了一个带比较器的Sparse-Table模板
int a[size];
struct Comper{
int operator () (const int x,const int y){
return a[x] < a[y]?x:y;
}
}comp;
/*
* 这种情况下会返回最小值的下标
*/
const int MAXN = 50010;
struct RMQ{
int dp[MAXN][20];
int mm[MAXN];
//初始化RMQ, b数组下标从1开始,从0开始简单修改
RMQ(){}
void initRMQ(int n){
mm[0] = -1;
for(int i = 1; i <= n;i++){
mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1];
dp[i][0] = i;
}
for(int j = 1; j <= mm[n];j++)
for(int i = 1;i + (1<<j) -1 <= n;i++)
dp[i][j] = comp(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
//查询最大值
int rmq(int x,int y){
int k = mm[y-x+1];
return comp(dp[x][k],dp[y-(1<<k)+1][k]);
}
};
RMQ rmqq;
int main()
{
std::ios::sync_with_stdio(false);cin.tie(0);
int i,j;
srand(time(0));
int n = 9;
for (i=1;i<=n;i++){
a[i] = rand()%100;
}
for (i=1;i<=n;i++) cout << i << (i==n?'\n':'\t');
PrintArray(a+1,a+1+n,'\t');
cout << endl;
rmqq.initRMQ(n);
int k;
cin >> k;
while (k--){
int x,y;
cin >> x >> y;
int t = rmqq.rmq(x,y);
cout << t << endl;
cout << a[t] << endl;
}
return 0;
}