HDU 3486
总共n个元素,分成m段,每一段挑选出该段中的最大值,将最大值求和,看是否严格大于k。如果找不到输出-1。
如果分的组比较少,每一组元素比较多,那么所得的和就会比较小;如果组分得多,原来比较小的就有可能会成为最大的,那么所得的和也会大。如果每一个数,即每一个数一组,他们的和都不大于k的话,说明根本找不到m,输出-1
可能大家会想到暴力,用k除以最大的元素找到m的最小值,然后m不断++,暴力枚举。但这样实在是太慢了!为什么呢?首先分个组数,m不断加一,k可以到10个亿啊,组数会很多。。。
解法:二分+RMQ
如果分成三组可以,那么分成五组,六组,七组......肯定会更好,这就是明显的单调性!可以用二分!
至于RMQ就是求区间最值,用f数组构建ST表。f[i][j]表示以a[i]开头,长度为2^j的连续区间的最值。
//HDU 3486
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=200000+5;
int n,sum;
ll k;
int f[MAXN][25];
void RMQ()
{
for(int j