
RMQ(倍增法求ST)
发布日期:2021-05-06 14:13:05
浏览次数:18
分类:原创文章
本文共 1080 字,大约阅读时间需要 3 分钟。
解决什么问题:区间查询最值
倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找.
具体理解看代码:
/*倍增法求ST*/#include<math.h>#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int main(){ int n,dp[110][110]; memset(dp,0,sizeof(dp)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&dp[i][0]); /*dp[i][j]=x x就是[i,i+2^j-1]的最大值*/ for(int j=1;j<=log2(n);j++)/* 保证2 ^ j < = n */ for(int i=1;i<=n-(1<<j)+1;i++)/* i+2^j-1<=n -> i<=n-2^j+1 */ dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); /*对于所有点 i 由已知u [i,i+2^(j-1)-1] 范围内的最值求出他的二倍范围内的最值 for(int i=1;i<=n;i++) { printf("i=%d\n",i); printf("dp[%d][0]:%d ",i,dp[i][0]); for(int j=1;j<=log2(n);j++) if(dp[i][j]) printf("dp[%d][%d]=dp[%d][%d],dp[%d][%d]:%d ",i,j,i,j-1,i+(1<<(j-1)),j-1,dp[i][j]);//i,i+2^j-1 printf("\n"); } 好像确实像二分多一点*/ int l,r,k; scanf("%d%d",&l,&r); k=log2(r-l+1); /* 2^k 为从l开始的查询区间的长度,2^k<r-l+1 -> l<r-2^k+1 */ printf("%d\n",max(dp[l][k],dp[r-(1<<k)+1][k])); return 0;}/*101 2 3 4 5 6 7 8 9 10*/
发表评论
最新留言
不错!
[***.144.177.141]2025年04月05日 03时12分56秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
《Java---------java环境搭建》
2019-03-04
【SSL】1203书的复制(normal)
2019-03-04
【SSL】1072砝码称重
2019-03-04
【SSL】2294打包
2019-03-04
标程_高精度运算
2019-03-04
【SSL】1033&【洛谷】P1040加分二叉树
2019-03-04
js数据结构--队列--常见操作
2019-03-04
JS数据结构--单向链表--常见操作
2019-03-04
【SSL】1606&【洛谷】P2014选课
2019-03-04
JS数据结构--双向链表--常见操作
2019-03-04
【SSL】1230&【洛谷】P2016战略游戏
2019-03-04
洛谷P1377树的序
2019-03-04
高阶函数-语法糖-lambda(三分钟读懂)
2019-03-04
vue的computed单向绑定(如淘宝的购物车中使用)
2019-03-04
vue双向绑定
2019-03-04
vue写自定义指令(全局或者组件内部)
2019-03-04
vue监听用户点击区域
2019-03-04
python functools模块方法
2019-03-04
python os库
2019-03-04