RMQ 区间最值 模板
来源:互联网 发布:机甲风暴java破解版 编辑:程序博客网 时间:2024/05/22 02:28
- RMQ 的全称为Range Max/Min Query。
- 构造dp数组的时间为O(nlogn), 但是查询时间为O(1),所以当数据量小于logn时,用朴素遍历找最值就好,但是请求次数大于logn时,就要用这个模板。
- 利用动态规划的思想。
int order[maxn];//使每一个2^order[i] <= i <= 2^(order[i]+1)void init_order(int n){ order[0] = -1; for(int i = 1; i <= n; ++i) order[i] = ((i&(i-1))==0) ? order[i-1]+1 : order[i-1];}//求值//2^20 > maxn,动态规划,保存最优值int dp_min[maxn][20];void init_RMQ_min(int n, int v[]){//需要先执行init_order for(int i = 0; i < n; ++i) dp_min[i][0] = v[i]; for(int i = 1; i <= order[n]; ++i) for(int j = 0; j < n+1-(1<<i); ++j) dp_min[j][i] = min(dp_min[j][i-1], dp_min[j+(1<<(i-1))][i-1]);}int ask_RMQ_min(int l, int r){//r >= l int k = order[r-l+1]; return min(dp_min[l][k], dp_min[r-(1<<k)+1][k]);}int dp_max[maxn][20];void init_RMQ_max(int n, int v[]){//需要先执行init_order for(int i = 0; i < n; ++i) dp_max[i][0] = v[i]; for(int i = 1; i <= order[n]; ++i) for(int j = 0; j < n+1-(1<<i); ++j) dp_max[j][i] = max(dp_max[j][i-1], dp_max[j+(1<<(i-1))][i-1]);}int ask_RMQ_max(int l, int r){//r >= l int k = order[r-l+1]; return max(dp_max[l][k], dp_max[r-(1<<k)+1][k]);}//求下标int dp_min_idx[maxn][20];void init_RMQ_min_idx(int n, int v[]){//需要先执行init_order for(int i = 0; i < n; ++i) dp_min_idx[i][0] = i; for(int i = 1; i <= order[n]; ++i) for(int j = 0; j < n+1-(1<<i); ++j) dp_min_idx[j][i] = v[dp_min_idx[j][i-1]] < v[dp_min_idx[j+(1<<(i-1))][i-1]] ? dp_min_idx[j][i-1] : dp_min_idx[j+(1<<(i-1))][i-1];}int ask_RMQ_min_idx(int l, int r, int v[]){//r >= l int k = order[r-l+1]; return v[dp_min_idx[l][k]] < v[dp_min_idx[r-(1<<k)+1][k]] ? dp_min_idx[l][k] : dp_min_idx[r-(1<<k)+1][k];}int dp_max_idx[maxn][20];void init_RMQ_max_idx(int n, int v[]){//需要先执行init_order for(int i = 0; i < n; ++i) dp_max_idx[i][0] = i; for(int i = 1; i <= order[n]; ++i) for(int j = 0; j < n+1-(1<<i); ++j) dp_max_idx[j][i] = v[dp_max_idx[j][i-1]] > v[dp_max_idx[j+(1<<(i-1))][i-1]] ? dp_max_idx[j][i-1] : dp_max_idx[j+(1<<(i-1))][i-1];}int ask_RMQ_max_idx(int l, int r, int v[]){//r >= l int k = order[r-l+1]; return v[dp_max_idx[l][k]] > v[dp_max_idx[r-(1<<k)+1][k]] ? dp_max_idx[l][k] : dp_max_idx[r-(1<<k)+1][k];}
1 0
- RMQ 区间最值 模板
- RMQ区间最值模板
- RMQ(模板 ST 区间最值,区间频繁次数)
- RMQ 模板 ,返回区间最值 、 最值的下标
- 区间最值 RMQ
- RMQ(区间最值)
- rmq区间最值
- rmq(区间最值)
- (RMQ)求区间最值及其下标 模板
- RMQ 区间最值问题
- RMQ区间最值问题
- RMQ求区间最值
- RMQ-区间最值问题
- RMQ-区间最值查询
- RMQ求区间最值
- RMQ 求区间最值
- POJ 3264 Balanced Lineup 【RMQ求区间最值模板题】
- ACM常用模板——数据结构——区间最值查询RMQ
- mybatis打印sql和参数
- Android 监听wifi广播的两种方式
- Socket 和Http
- MR简单串联(ChainMapper/ChainReducer)
- 【机器学习】决策树的优缺点
- RMQ 区间最值 模板
- Activity的生命周期
- 任务:板接弹球
- InjectorJob架构及流程
- Android RecyclerView 使用完全解析 体验艺术般的控件
- android 异常处理
- Linux下的目录及其操作命令(改变用户组和文件主的命令
- 小技巧解决:vector变量引用,传入dll库函数中,增加内容,vector变量生命周期结束的时候,会触发断点
- NY机器学习面试