题目描述
有 n 棵树排成一排,第 i 棵树的高度是 di。
有 q 只鸟要从第 1 棵树到第 n 棵树。
当第 i 只鸟在第 j 棵树时,它可以飞到第 j+1,j+2,⋯,j+ki 棵树。
如果一只鸟飞到一颗高度大于等于当前树的树,那么它的劳累值会增加 1,否则不会。
由于这些鸟已经体力不支,所以它们想要最小化劳累值。
输入格式
第一行输入 n。
第二行 n 个数,第 i 个数表示 di。
第三行输入 q。
接下来 q 行,每一行一个整数,第 i 行的整数为 ki。
输出格式
共 q 行,每一行输出第 i 只鸟的最小劳累值。
输入输出样例
输入 #1复制
9
4 6 3 6 3 7 2 6 5
2
2
5
输出 #1复制
2
1
说明/提示
1≤n≤106,1≤di≤109,1≤q≤25,1≤ki≤n−1。
代码实现:
cpp
#include<bits/stdc++.h>
#define int long long
#define rep(i,s,t) for(int i=s;i<=t;i++)
using namespace std;
const int N=1e6+114;
int n,d[N],q,f[N],k[N],que[N],h=0,t=0;
signed main() {
cin>>n;
for(int i=1;i<=n;i++)cin>>d[i];
cin>>q;
while(q--) {
int x;cin>>x;h=t=1;que[t]=1;
for(int i=2;i<=n;i++) {
while(h<=t && i-que[h]>x)h++;
if(d[que[h]]>d[i])f[i]=f[que[h]];
else f[i]=f[que[h]]+1;
while(h<=t && (f[i]<f[que[t]] || f[i]==f[que[t]] && d[que[t]]<=d[i]))t--;
que[++t]=i;
}
cout<<f[n]<<endl;
}
return 0;
}