以下给出ac代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
const int maxn=1e6+7;
int h[maxn],q[maxn],head,tail,dp[maxn];
int n,m,k;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&h[i]);
scanf("%d",&m);
while(m--){
scanf("%d",&k);head=tail=1;q[head]=1;
for(int i=2;i<=n;i++){
while(head<=tail&&i-q[head]>k)head++;
if(h[q[head]]>h[i])dp[i]=dp[q[head]];
else dp[i]=dp[q[head]]+1;
while(head<=tail&&(dp[i]<dp[q[tail]]||(dp[i]==dp[q[tail]]&&h[i]>=h[q[tail]])))tail--;
q[++tail]=i;
}
printf("%d\n",dp[n]);
}
return 0;
}