您的位置:首页 > 其它

POJ 3264 Balanced Lineup RMQ问题 ST算法

2016-07-17 13:55 316 查看
ST算法的裸题,适合初学时做

参考资料:《训练指南》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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 算法 ST RMQ