WA,求大佬解释
查看原帖
WA,求大佬解释
808332
BVVD_FM楼主2023/4/12 12:57
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,q,cnt;
int a[N],f[N][21],zu[N];
struct node{
	int l,r,sum;// 这个块的左端点,右端点,有几个数 
}st[N];//第几个块 
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}//快读 
int maxx(int l,int r){
	int k=log2(r-l+1);
	return max(f[l][k],f[r-(1<<k)+1][k]);
}
int Cz(int l,int r){//建立一个数组存第i个元素属于第几块 
	if(zu[l]==zu[r]) return r-l+1;
	int zk=st[zu[l]].r-l+1,yk=r-st[zu[r]].l+1,ans=max(zk,yk);
	int ks=zu[l],end=zu[r];
	if(ks+1==end) return ans;
	ks++,end--;
	int ans1=maxx(ks,end);
	return max(ans1,ans);	
}
void init(){
	memset(st,0,sizeof st);
	memset(zu,0,sizeof zu); 
	memset(f,0,sizeof f);
}
int main(){
	while(1){
		n=read();if(n==0) return 0;
		q=read();
		cnt=0;
		int su=1;
		init();
		a[0]=-100010;
		for(int i=1;i<=n;i++){
			a[i]=read();
			if(a[i-1]!=a[i]){
				st[cnt].sum=su;
				su=0;
				st[cnt++].r=i-1;
				st[cnt].l=i;	
			} 
			zu[i]=cnt;
			su++;
		}
		st[cnt].r=n;
		st[cnt].sum=su;
		//处理基础信息 
		for(int i=1;i<=cnt;i++){
			f[i][0]=st[i].sum;
		}
		int k=log2(cnt);
		for(int j=1;j<=k;j++){
			for(int i=1;i+(1<<j)-1<=cnt;i++){
				f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]); 
			}
		} 
		for(int i=1;i<q;i++){
			int l,r;
			l=read(),r=read();
			printf("%d\n",Cz(l,r));
		}	
		int l,r;
		l=read(),r=read();
		printf("%d",Cz(l,r));
	} 
	return 0;
}
/*




*/
2023/4/12 12:57
加载中...