问题描述:
在数学课上,NanoApe 心痒痒又玩起了数列。他在纸上随便写了一个长度为
n
的数列,他又根据心情写下了一个数
输入描述
第一行为一个正整数
每组数据的第一行为三个整数
n
,
第二行为
1<=T<=10
,
2<=n<=200000
,
1<=k<=n/2
,
1<=m
,
Ai<=109
输出描述:
对于每组数据输出一行一个数表示答案。
解题思路:
这题一看就会让人想到
dp
,
dp[i]
表示到
i
位置之前的满足条件的序列个数,下标从
小于m时
当大于等于
m
时,先让当前下标值进队,队首
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
#define ll long long
queue <ll>q;
ll a[200050];
ll dp[200050];
int main(){
ll T,num,tmp,ans,n,m,k;
scanf("%I64d",&T);
while(T--)
{
while(!q.empty())
q.pop();
scanf("%I64d%I64d%I64d",&n,&m,&k);
for(ll i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
}
memset(dp,0,sizeof(dp));
for(ll i=0;i<n;i++)
{
if(q.size()<k)
{
if(a[i]>=m)
q.push(i);
if(q.size()==k)
dp[i]=q.front()+1;
else
dp[i]=0;
continue;
}
if(a[i]<m)
{
dp[i]=dp[i-1]+1+q.front();
}
else
{
q.push(i);
q.pop();
dp[i]=dp[i-1]+1+q.front();
}
}
printf("%I64d\n",dp[n-1]);
}
return 0;
}