【POJ 3264】Balanced Lineup 【RMQ裸题】

来源:互联网 发布:mac nice to meet 停产 编辑:程序博客网 时间:2024/05/22 16:42

题很水啊,只是拿来练习SparseTable,一种tarjan提出的数据结构。
好吧,其实就是倍增思想。因为LCA->RMQ问题中我ST表不会写所以特来练习,水一发。
如果不会ST表的可以看http://blog.csdn.net/niushuai666/article/details/6624672

#include<cstdio>#include<cmath>#include<iostream>#include<algorithm>using namespace std;const int N = 50010;int n,q,t,f[N][20],g[N][20];void initSparseTable(int len){    int block=log(len*1.0)/log(2.0);    for(int j=1;j<=block;j++){//i + 2^(j-1) + 2^(j-1) - 1 <= n ==> i <= n + 1 - 2^j          for(int i=1;i<=n+1-(1<<j);i++){            f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);            g[i][j]=min(g[i][j-1],g[i+(1<<(j-1))][j-1]);        }    }}int RMQ(int a,int b){    int block=log((b-a+1)*1.0)/log(2.0);    return max(f[a][block],f[b-(1<<block)+1][block])-min(g[a][block],g[b-(1<<block)+1][block]);}int main(){    scanf("%d%d",&n,&q);for(int i=1;i<=n;i++)scanf("%d",&t),f[i][0]=g[i][0]=t;      initSparseTable(n);int a,b;    while(q--){scanf("%d%d",&a,&b);if(a>b)swap(a,b);printf("%d\n",RMQ(a,b));}       return 0;}
1 0
原创粉丝点击