题型:动态规划
题意:
有n个囚犯站成一列,每个人有值ai表示危害程度。要连续的选c个人转移到其他监狱,且这c个人中的危害程度不能大于t,问有多少中选法。
分析:
一维RMQ查询每个c长的区间内最大值,如果最大值大于t,这个区间就不能选。
统计一遍即可。
代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,t,c;
int ans;
int RMQ_max[200010][20];
double Limit;
void init(int n){
Limit = log(n)/log(2.0);
int tmp;
for(int i=1;i<=n;i++){
scanf("%d",&tmp);
RMQ_max[i][0] = tmp;
}
for(int i=1;i<=Limit;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
RMQ_max[j][i] = max(RMQ_max[j][i-1],RMQ_max[j+(1<<(i-1))][i-1]);
}
}
}
void RMQ_find(){
for(int i=1;i<=n-c+1;i++){
int pos1 = i;
int pos2 = i+c-1;
int s = (int)(log(pos2-pos1+1)/log(2.0));
int MAXN = max(RMQ_max[pos1][s],RMQ_max[pos2-(1<<s)+1][s]);
if(MAXN <= t) ans++;
}
}
int main(){
while(~scanf("%d%d%d",&n,&t,&c)){
init(n);
ans = 0;
RMQ_find();
printf("%d\n",ans);
}
return 0;
}
//2 2 0 7 3 2 2 4 9 1 4