POJ 3264 Balanced Lineup RMQ问题 ST算法

来源:互联网 发布:windows平板哪个好 编辑:程序博客网 时间:2024/05/16 15:23

ST算法的裸题,适合初学时做

参考资料:《训练指南》P197

#include <cstdio>#include <algorithm>#include <cmath>#define exp 1e-7using 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;}


0 0
原创粉丝点击