维护区间[nowclocki,i]的左端点值和右端点值和区间内的元素数目,如果nowclock指向的元素已经处理过或者不满足
ai−anowclocki<m
则左端点右移,如果处理完以后区间内仍然有k个元素,则“关掉第i个闹钟”。
#include <cstdio>
#include <algorithm>
using namespace std;
int clock[200005];
int main(){
int n,m,k,cnt=0,clcnt=0,nowclocki=0;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)scanf("%d",&clock[i]);
sort(clock,clock+n);
for(int i=0;i<n;i++){
while((clock[nowclocki]==1e8||clock[i]-clock[nowclocki]>=m)&&nowclocki<=i){
if(clock[nowclocki++]!=1e8)cnt--;
}
if(++cnt==k){clcnt++;cnt--;clock[i]=1e8;}
}
printf("%d",clcnt);
}