python代码
n,d,k=map(int,input().split())
N=100010
a=[]
cnt=[0]*N
st=[0]*N
for i in range(n):
a.append(list(map(int,input().split())))
a.sort() # 按时间先后排序
# 核心思想:找出符合要求的时间区间,即时间长度<d,
# 尾指针在每一个循环中右移+1,将尾指针对应id的cnt+1
# 若头尾指针的时间跨度>=d,不合法,则将头指针右移,直到区间合法
# (由于区间此时不再包含头指针,要减去开头的值,即头指针对应id的cnt--,并将头指针右移+1)
# 一旦在一个合法区间内,cnt>=k,则对应id的状态st由初始的0变为1
j=0
for i in range(n):
id=a[i][1]
# cnt列表负责统计对应id出现的次数
cnt[id]+=1
# 当移动计算长度d区间内的点赞数cnt时,只有开头和结尾不一样
# 令头指针为j,尾指针为i
while(a[i][0]-a[j][0]>=d):
cnt[a[j][1]]-=1
j+=1
if cnt[id]>=k:
st[id]=1
for i in range(N):
if st[i]:
print(i)