题目连接:点这里c++
设\(f[i][j]\)表示以j为左端点,合并后最大值为i的序列的右端点的位置git
那么咱们能够获得状态转移方程\(f[i][j]=f[i-1][f[i-1][j]+1]\)spa
由于\(N\le262144\),因此i最大可能为58,那么咱们枚举便可code
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=262146; int n,ans,f[59][N]; int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();} while(isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f; } int main(){ n=read();for(int i=1;i<=n;i++) f[read()][i]=i; for(int i=1;i<=58;i++) for(int j=1;j<=n;j++){ !f[i][j]&&f[i-1][j]&&(f[i][j]=f[i-1][f[i-1][j]+1]); f[i][j]?ans=i:0; }printf("%d\n",ans); return 0; }