POJ 3264 Balanced Lineup RMQ问题 ST算法
2016-07-17 13:55
316 查看
ST算法的裸题,适合初学时做
参考资料:《训练指南》P197
参考资料:《训练指南》P197
#include <cstdio> #include <algorithm> #include <cmath> #define exp 1e-7 using namespace std; int a[50010],n,q; int dpmax[50010][20],dpmin[50010][20]; inline int log2(int x) { return (int)(log(x)/log(2)+exp); } void make_dp() { for (int i=1;i<=n;i++) { dpmax[i][0]=a[i]; dpmin[i][0]=a[i]; } for (int i=1;i<=20;i++) { for (int j=1;j<=n;j++) { if (j+(1<<i)-1<=n) { dpmax[j][i]=max(dpmax[j][i-1],dpmax[j+(1<<(i-1))][i-1]); dpmin[j][i]=min(dpmin[j][i-1],dpmin[j+(1<<(i-1))][i-1]); } } } } int query(int l,int r) { int t=log2(r-l+1); int mina=min(dpmin[l][t],dpmin[r+1-(1<<t)][t]); int maxa=max(dpmax[l][t],dpmax[r+1-(1<<t)][t]); return maxa-mina; } int main() { scanf("%d%d",&n,&q); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); } make_dp(); int x,y; for (int i=1;i<=q;i++) { scanf("%d%d",&x,&y); printf("%d\n",query(x,y)); } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法