《算法竞赛-训练指南》第三章-RMQ
来源:互联网 发布:软件工程项目计划 编辑:程序博客网 时间:2024/06/19 05:12
RMQ求区间内的最大值,最小值。平常的区间更新算法都不很好求,当然线段树可以。马上写线段树的算法。
具体的讲解都在代码中:
#include <stdio.h>#include <string.h>#include <iostream>#include <string>using namespace std;const int MAXN = 1000 + 11;int A[MAXN];int N;int d[MAXN][22];void RMQ_init() //请一定注意RMQ的值的范围是从1-N; {for (int i = 1; i <= N; i++) //这是设置边界条件,因为会用到j等于0的时候,当j = 1的时候j - 1 就等于0; {d[i][0] = A[i];}for (int j = 1; (1 << j) <= N; j++){for (int i = 1; i + (1 << j) - 1 <= N; i++) //我就觉得书上描述的是错的,就应该是这样的。 {d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]); //这就是dp的递归求解。 }}}int RMQ(int L, int R) //查询的时候首先的就是确定最近的2^j满足R-L + 1的范围,然后就可以求出答案,当然求最大值也是一样。 {int k = 0;while ((1 << (k + 1)) <= R - L + 1){k++;}return min(d[L][k], d[R - (1 << k) + 1][k]);}int main(){while (scanf("%d", &N) != EOF){for (int i = 1; i <= N; i++){scanf("%d", &A[i]);}RMQ_init();int ans = RMQ(1, N);printf("%d\n", ans);}system("pause");return 0;}
- 《算法竞赛-训练指南》第三章-RMQ
- 《算法竞赛-训练指南》-第三章-Trie
- 《算法竞赛-训练指南》第三章-2.2_UVa 11991
- 《算法竞赛-训练指南》第三章-3.8_UVa 11235
- 《算法竞赛-训练指南》第二章-HDU_2018
- 《算法竞赛-训练指南》第三章-3.1_UVa 11995(STL数据结构运用)
- 《算法竞赛-训练指南》第三章-3.6_LA 3027(并查集)
- 《算法竞赛-训练指南》第三章-3.7_LA 3429(树状数组)
- 《算法竞赛-训练指南》第二章-数论常用算法总结
- 《算法竞赛-训练指南》第二章-2.1_UVa 11538
- 《算法竞赛-训练指南》第二章-2.2_UVa 11401
- 《算法竞赛-训练指南》第二章-2.3_UVa 11806
- 《算法竞赛-训练指南》第二章-2.4-pre_Catalan
- 《算法竞赛-训练指南》第二章-2.4-LA 3516
- 《算法竞赛-训练指南》第二章-2.5_UVa 11361
- 《算法竞赛-训练指南》第二章-2.9_UVa 11426
- 《算法竞赛-训练指南》第二章-2.12_LA 5059
- 《算法竞赛-训练指南》第二章-2.14_UVa 11021
- Error opening/initializing the selected video_out (-vo) device.
- 配置JDK的环境变量
- hdu1420 Prepared for New Acmer (a^i mod n)
- java写的一个冒泡排序
- FansUnion:共同写博客计划终究还是“流产”了
- 《算法竞赛-训练指南》第三章-RMQ
- 【Android 开发】:通知之 Status Bar Notifications
- Sliverlight 将页面导出各种图片
- [JAVA]编码GBK的不可映射字符
- ORACLE数据类型
- foreach循环
- rpm包如何制作-个人经验
- JAVA ,SSH中文及其乱码问题的解决 6大配置点 使用UTF-8编码
- 智力杠杆