谁知道我错哪里了
查看原帖
谁知道我错哪里了
91737
rex_qwq楼主2023/9/26 21:32

RT,样例没过

#include<bits/stdc++.h>
using namespace std;
#define int  long long
#define kg putchar(' ')
#define endl puts("")
inline int read(){
	int vis=1,ans=0;
	char x=getchar();
	while(x<'0'||x>'9'){
		if(x=='-')vis=-1;
		x=getchar();
	}
	while(x>='0'&&x<='9'){
		ans=ans*10+x-'0';
		x=getchar();
	}
	return vis*ans;
}
inline void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)print(x/10);
	putchar(x%10+'0');
}
const int N=5e5+9;
int T=read(),n,opt,l,r;
int x[N];
int gcd(int x,int y){
	if(x%y==0)return y;
	else return gcd(y,x%y);
}
struct node{
	int l,r,Gcd;
}e[4*N];
inline void pushup(int p){
	e[p].Gcd=gcd(e[p<<1|1].Gcd,e[p<<1].Gcd);
}
inline void build(int p,int l,int r){
	e[p].l=l,e[p].r=r;
	if(l==r){
		e[p].Gcd=x[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
inline int ask(int p,int l,int r){
	if(l<=e[p].l&&e[p].r<=r){
		return e[p].Gcd;
	}
	int ans=0,mid=(e[p].l+e[p].r)>>1;
	if(l<=mid)ans=gcd(ans,ask(p<<1,l,r));
	if(r>mid)ans=gcd(ans,ask(p<<1|1,l,r));
	pushup(p);
	return ans;
}
signed main(){
	while(T--){
		if(n==1){print(1);continue;}
		n=read();
		for(int i=1;i<=4*n+1;i++)e[i].l=e[i].r=e[i].Gcd=0;
		for(int i=1;i<=n;i++)x[i]=0;
		x[1]=read();
		for(int i=2;i<=n;i++){
			x[i-1]=abs(read()-x[i-1]);
		}
		build(1,1,n-1);
		int j=1,maxn=0;
		for(int i=1;i<n;i++){
			while(j<=i&&ask(1,j,i)==1)j++;
			maxn=max(maxn,i-j+2); 
		}
		print(maxn),endl;
	}
	
	return 0;
}
2023/9/26 21:32
加载中...