首先考虑暴力dfs:每次确定一个起点后不断搜索最近的下一个值的位置。提交后发现T了,然后想到如果一个起点的长度很大,并且这个值在前面出现了好多次,那么复杂的很大,几乎是n^2,所以考虑如果有多个相同的数,一定是选最前面那个作为起点最优,所以用map记录一下每个值作为起点的最长长度,类似记忆搜。
int n;
int a[maxn];
int ans=1;
vector <int> G[maxn];
map <int,int> mp;
void dfs(int s1,int pos,int len){
ans=max(ans,len);
mp[s1]=len;
len++;
int need=s1;
if(len&1) need-=len/2;
else need+=len/2;
if(need>=1 && need<=1000000 && G[need].size()){
int p=upper_bound(G[need].begin(),G[need].end(),pos)-G[need].begin();
if(G[need][p]>pos){
dfs(s1,G[need][p],len);
}
}
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
G[a[i]].pb(i);
}
for(int i=1;i<=n;i++){
if(mp[a[i]]) continue;
dfs(a[i],i,1);
}
cout<<ans<<endl;
}