dp[ i ]表示到第i个位置最少要分多少下, dp[ i ] = min ( dp [ i ] , dp [ j ] + 1 ) j 在合适的范围内 ( 满足长度和最值差 )
对整个数组建立线段树维护最大值和最小值这样就可在nlogn的时间里求出某一段的最值差,这个范围是满足单调性的,所以对于每个i可以二分出j的最小值 .
对每个dp[i]建立线段树,可以在nlogn时间内求出最小的j.
所以总时间复杂度n^2logn
/* ***********************************************
Author :CKboss
Created Time :2015年03月11日 星期三 23时20分17秒
File Name :CF487B.cpp
************************************************ */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include