Description
公元20XX年,人类与外星人之间的大战终于爆发。
现有一个人类军团,由n名士兵组成,第i个士兵的战斗力值对应一个非负整数ai (1 \leq i \leq n1≤i≤n)。
有一天,某个战力爆表的外星人NaN单独向地球人宣战,已知它的战力值为k (1 \leq k \leq 1e131≤k≤1e13)。现在该军团指挥官决定派遣编号在某个区间(l,r)内的士兵去与敌方决斗。由于对手的不一般,现规定一个奇怪的战力值计算公式:f(l,r)=[max(l,r)-min(l,r)]*(r-l+1)f(l,r)=[max(l,r)−min(l,r)]∗(r−l+1),(1 \leq l < r \leq n)(1≤l<r≤n)。
即只有当f(l,r) \geq kf(l,r)≥k时才能战胜敌人。请聪明的你来计算至少需要派出多少名士兵才能战胜敌人。
Input
第一行输入两个整数nn,kk,(1 \leq n \leq 2e5,1 \leq k \leq 1e131≤n≤2e5,1≤k≤1e13),分别代表军团士兵个数和敌人战力值;第二行输入nn个整数,表示第i(1\leq i \leq n)i(1≤i≤n)名士兵的战力值(0 \leq ai \leq 1e9)(0≤ai≤1e9)。
Output
答案输出一个正整数表示应派出士兵的数量,如果不存在则输出-1−1。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
5 3
1 2 3 4 5
样例输出复制
3
解题报告:
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAX = 2e5 + 5;
int n;
ll a[MAX],k;
struct TREE {
int l,r;
ll val,maxx,minn;
} tree[MAX * 4];
void pushup(int cur) {
tree[cur].val = tree[cur*2].val + tree[cur*2+1].val;
tree[cur].maxx = max(tree[cur*2].maxx , tree[cur*2+1].maxx);
tree[cur].minn = min(tree[cur*2].minn , tree[cur*2+1].minn);
}
void build(int l,int r,int cur) {
tree[cur].l=l;tree[cur].r=r;
if(l == r) {
tree[cur].val = tree[cur].maxx = tree[cur].minn = a[l];
return ;
}
int m = (l+r)/2;
build(l,m,cur*2);
build(m+1,r,cur*2+1);
pushup(cur);
}
ll querymax(int pl,int pr,int cur) {
if(pl <= tree[cur].l && pr >= tree[cur].r) return tree[cur].maxx;
ll res = 0;
if(pl <= tree[cur*2].r) res = max(res,querymax(pl,pr,cur*2));
if(pr >= tree[cur*2+1].l) res = max(res,querymax(pl,pr,cur*2+1));
return res;
}
ll querymin(int pl,int pr,int cur) {
if(pl <= tree[cur].l && pr >= tree[cur].r) return tree[cur].minn;
ll res = LLONG_MAX;
if(pl <= tree[cur*2].r) res = min(res,querymin(pl,pr,cur*2));
if(pr >= tree[cur*2+1].l) res = min(res,querymin(pl,pr,cur*2+1));
return res;
}
bool fit(int x) {
for(int i = 1; i<=n-x+1; i++) {
if((querymax(i,i+x-1,1) - querymin(i,i+x-1,1)) * x >= k) return 1;
}
return 0 ;
}
int main()
{
cin>>n>>k;
for(int i = 1; i<=n; i++) cin>>a[i];
build(1,n,1);
int l = 0;int r = n;
int mid = (l+r)/2;
while(l<r) {
mid = (l+r)/2;
if(fit(mid)) r=mid;
else l=mid+1;
}
printf("%d\n",l);
return 0 ;
}