直接RMQ即可,最后套一个简单DP。
RMQ求出区间的元素的最大值和最小值。
后面直接一遍DP。
dp[i]表示前i个数最少要分成多少份。
满足条件时:
d p [ i ] = m i n ( d p [ i ] , d p [ o k ] + 1 ) dp[i]=min(dp[i],dp[ok]+1) dp[i]=min(dp[i],dp[ok]+1)
#include<bits/stdc++.h>
#define inf 2147483647
#define N 100010
using namespace std;
int maxn[N][22],minn[N][22],n,s,ll,dp[N],cnt;
int