bzoj1699 排队【稀疏表】

来源:互联网 发布:聂风入魔知乎 编辑:程序博客网 时间:2024/06/15 07:22

解题思路:

稀疏表模板题。
注意数组要开大点,倍增预处理时容易越界。

#include<bits/stdc++.h>#define ll long longusing namespace std;int getint(){    int i=0,f=1;char c;    for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());    if(c=='-')f=-1,c=getchar();    for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';    return i*f;}const int N=100005,LogN=20;int n,m,a[N],mx[N][LogN],mi[N][LogN],Log[N];int main(){    //freopen("lx.in","r",stdin);    n=getint(),m=getint();    for(int i=1;i<=n;i++)        a[i]=mx[i][0]=mi[i][0]=getint();    Log[1]=0;    for(int i=2;i<=n;i++)Log[i]=Log[i>>1]+1;    for(int j=1;j<=Log[n];j++)        for(int i=1;i<=n;i++)        {            mx[i][j]=max(mx[i][j-1],mx[i+(1<<j-1)][j-1]);            mi[i][j]=min(mi[i][j-1],mi[i+(1<<j-1)][j-1]);        }    while(m--)    {        int l=getint(),r=getint(),x=Log[r-l+1];        int t1=max(mx[l][x],mx[r-(1<<x)+1][x]),t2=min(mi[l][x],mi[r-(1<<x)+1][x]);        cout<<t1-t2<<'\n';    }    return 0;}