P3147 262144

题面:https://www.luogu.org/problemnew/show/P3147

本题设f[i][j]表示左端点为j,能合并出i这个数字的右端点的位置
由于位置为j的数和位置为f[i-1][j]的数可以合成一个i-1
那么位置为f[i-1][j]的数和位置为f[i-1][f[i-1][j]]的数也可以合成一个i-1
那么这样就可以合成一个i了
所以就有了f[i][j]=f[i−1][f[i−1][j]]

Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=270000,M=65;
long long n,a,i,j,f[M][N],ans;
int main(){
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>a;
        f[a][i]=i+1;
    }
    for(i=2;i<=60;i++){
        for(j=1;j<=n;++j){
            if(!f[i][j]){
                f[i][j]=f[i-1][f[i-1][j]];
            }
            if(f[i][j]){
                ans=i;
            }
        }
    }
    cout<<ans<<endl;
    //system("pause");
    exit(0);
}
posted @ 2019-07-16 14:05  prestige  阅读(108)  评论(0编辑  收藏  举报