1 条题解
-
0
#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
信息
- ID
- 465
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 190
- 已通过
- 39
- 上传者