(一)
一段一段找。
固定左節點 \(l\),右節點 \(r\) 越遠越好。
然後 \(l=r+1\) 繼續搜。
如果 \(l\) 和 \(r\) 的距離不小於 \(k\):
新增 \(1+2+...+(r-l+1-k+1)=\frac{(r-l+2-k)\times(r-l+3-k)}{2}\) 個。
(二)
AC 程式碼。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,k,q,a[200001];
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld%lld",&n,&k,&q);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
int l=1,r=1,ans=0;
while(1){
while(l<=n&&a[l]>q)l++;
if(l>n)break;
r=l;
while(r<n&&a[r+1]<=q)r++;
if(r-l+1>=k)ans+=(r-l+2-k)*(r-l+3-k)/2;
l=r+1;
}
printf("%lld\n",ans);
}
return 0;
}