CF1840C的題解

Jerry_heng發表於2024-03-28

(一)

一段一段找。

固定左節點 \(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;
}