80分,T了两个点.
为什么捏?
#include<bits/stdc++.h>
using namespace std;
#define rt register int
int n,k,a[1000005],q,dp1[1000005];
int hh,tt,q1[1000005];
int main()
{
scanf("%d",&n);
for(rt i=1;i<=n;++i)scanf("%d",&a[i]);
scanf("%d",&q);
while(q--)
{
scanf("%d",&k);
for(rt i=1;i<=n;++i)dp1[i]=1000006;
dp1[1]=0;hh=tt=1;q1[hh]=1;
for(rt i=2;i<=n;++i){
while(q1[hh]<i-k&&hh<=tt)hh++;
for(rt j=hh;j<=tt;++j)
if(a[i]<a[q1[j]]) dp1[i]=min(dp1[i],dp1[q1[j]]);
else dp1[i]=min(dp1[i],dp1[q1[j]]+1);
while(dp1[q1[tt]]>dp1[i]||(a[i]>a[q1[tt]]&&dp1[q1[tt]]==dp1[i])&&hh<=tt)tt--;
q1[++tt]=i;
}
printf("%d\n",dp1[n]);
}
return 0;
}