1 条题解

  • 0
    @ 2025-10-8 16:50:44
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int f[N][20],a[N],b[N],bel[N],L[N],R[N],lg2[N];
    template<typename T>void qr(T& x)
    {
    	x=0;int f=1;char c=getchar();
    	for( ;!isdigit(c);c=getchar())if(c=='-')f=-1;
    	for( ; isdigit(c);c=getchar())x=x*10+c-48;
    	x=x*f;
    }
    int query(int l, int r) 
    {
        int k=lg2[r-l+1];
        return max(f[l][k],f[r-(1<<k)+1][k]);
    }
    int main()
    {
        int n,m;qr(n);qr(m);
        lg2[1]=0;for(int i=2;i<=n;i++)lg2[i]=lg2[i>>1]+1;
        for(int i=1;i<=n;i++) qr(a[i]);
        int bn=0;memset(b,0,sizeof(b));
    	a[0]=-1e6;bn=0;
        for(int i=1;i<=n;i++)
    	{
            if(a[i]!=a[i-1]) L[++bn]=i;                   
            b[bn]++;bel[i]=bn;R[bn]=i;
        }
        for(int i=1;i<=bn;i++)f[i][0]=b[i];
        int D=lg2[bn];
        for(int i=1;i<=D;i++)
            for(int j=1;j+(1<<i)-1<=bn;j++)
                f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
    
        while(m--)
        {
            int x,y,bx,by; scanf("%d%d",&x,&y);if(x>y)swap(x,y);
            bx=bel[x];by=bel[y];
            int ans;
            if(bx==by)  ans=y-x+1;
            else        ans=max(R[bx]-x+1,y-L[by]+1);
            if(by>bx+1) ans=max(ans,query(bx+1,by-1));
            printf("%d\n",ans);
        }
        return 0;
    }
    
    • 1

    *【RMQ】区间出现次数最多的数[POJ3368]

    信息

    ID
    465
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    190
    已通过
    39
    上传者