CF1840C的题解

(一)

一段一段找。

固定左节点 \(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;
}
posted @ 2024-03-28 08:19  Jerry_heng  阅读(2)  评论(0编辑  收藏  举报