https://codeforc.es/contest/1549/problem/D
差分 gcd
st 尺取/二分
#include<bits/stdc++.h> #define inf 1e18 #define ll long long #define ull unsigned long long #define int long long #define PI acos(-1.0) using namespace std; const int N= 2e5+7; const int p= 998244353; int lg[N],a[N],gg[N][50],n,q,b[N]; int query(int l,int r){ int len=lg[r-l+1]; int ans=__gcd(gg[l][len],gg[r-(1<<(len))+1][len]); return ans; } void solve(){ lg[0]=-1; scanf("%lld",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } n--; for(int i=1;i<=n;i++){ b[i]=abs(a[i]-a[i+1]); //printf("%lld ",b[i]); lg[i]=lg[i/2]+1; } //printf(" "); for(int i=1;i<=n;i++) { gg[i][0]=b[i]; } for(int i=1;i<=lg[n];i++) { for(int j=1;j+(1<<i)-1<=n;j++) { gg[j][i]=__gcd(gg[j][i-1],gg[j+(1<<(i-1))][i-1]); } } int pos=1,ans=0; for(int i=1;i<=n;++i){ while(query(pos,i)==1&&pos<=i)pos++;//考虑到值本身就是1的情况 必须让pos向前消去影响 //printf("%lld %lld ",pos,i); ans=max(ans,i-pos+1); } printf("%lld ",ans+1); } signed main(){ int t=1; scanf("%lld",&t); while(t--){ solve(); } return 0; }