传送门biu~
令f[i][j]表示以第i个数字为左端点,合并出数字j后的右端点是第几个数字。
转移类似st算法,f[i][j]=f[ f[i][j-1] ][ j-1 ]。
#include<bits/stdc++.h>
#define N 270000
using namespace std;
int n,f[N][60],ans=1;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
int x;
scanf("%d",&x);
f[i][x]=i+1;
}
for(int i=2;i<=58;++i){
for(int j=1;j<=n;++j){
if(!f[j][i]) f[j][i]=f[f[j][i-1]][i-1];
if(f[j][i]) ans=i;
}
}
printf("%d\n",ans);
return 0;
}