一个dp水题 但是刚开始却没有想出来还是看了题解
题目链接
题目思路
刚开始想的是区间dp后来发现数据太大肯定会爆 发现可以这样做
用 f[i][j] 表示区间合并结果为i的左端点为j的右端点值
则有 f[i][j] = f[i - 1][f[i - 1][j]] 这个状态转移方程
看数据 n= 262144 2的18次方 所以最多加十八 即最大范围只能到58了
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 60, M = 270010;
int n, ans;
int f[N][M];
int main()
{
// f[i][j] = right, j = left, i = val;
// f[i][j] = f[i-1][f[i-1][j]]
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
{
int x;
scanf("%d", &x);
f[x][i] = i + 1;
}
for (int i = 1; i <= 58; i ++ )
{
for (int j = 1; j <= n; j ++ )
{
if (!f[i][j])
f[i][j] = f[i - 1][f[i - 1][j]];
if (f[i][j])
ans = max(ans, i);
}
}
printf("%d\n", ans);
return 0;
}