ST表求调
查看原帖
ST表求调
981994
xinglili楼主2024/5/6 21:21
#include<bits/stdc++.h>
using namespace std;

int n,m,idx,a[100005],lg[100005];
int f[100005][20],num[100005],l[100005],r[100005];

void init()
{
    lg[0]=-1;
    for(int i=1;i<=idx;i++)
    {
        lg[i]=lg[i/2]+1;
        f[i][0]=r[i]-l[i]+1;
    }

    for(int j=1;j<=lg[idx]+1;j++)
        for(int i=1;i+(1<<(j-1))<=idx;i++)
            f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}

int ask(int l,int r)
{
    int k=lg[r-l+1];
    return max(f[l][k],f[r-(1<<k)+1][k]);
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(i==1 || a[i]!=a[i-1])r[++idx]=i,l[idx]=i;//新建一个桶
        else r[idx]=i;
        num[i]=idx;//存放桶的索引
    }

    init();//对每个桶中的个数(r-l+1)进行预处理出st表
    
    while(m--)
    {
        int L,R;
        cin>>L>>R;

        int x=0,y=0,z=0;
        if(num[L]==num[R])z=R-L+1;//在一个桶中
        else
        {
            x=r[num[L]]-L+1,y=R-l[num[R]]+1;//两边的桶
            if(num[R]>num[L]+1)z=ask(num[L]+1,num[R]-1);//中间的桶
        }
        cout<<max({x,y,z})<<endl;
    }
    system("pause");
    return 0;
}

2024/5/6 21:21
加载中...