双指针算法
最最要的是两个指针同时移动,可以省去一重for循环
本题i在前面动,j在后面动
当i与j之间的距离超过d的时候,将数组更新把前面的计数减去,j向前移动
实现了每次枚举一段时间的效果
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
typedef pair<int, int > PII;
int n, d, k;
PII logs[N];
int cnt[N];
bool st[N];
int main()
{
cin >> n >> d >> k;
for (int i = 0; i < n; i++) {
cin >> logs[i].first >> logs[i].second;
}
sort(logs, logs + n);
for (int i = 0, j = 0; i < n; i++) {
int id = logs[i].second;
cnt[id]++;
while (logs[i].first - logs[j].first >= d) {
cnt[logs[j].second]--;
j++;
}
if (cnt[id] >= k)
st[id] = true;
}
for (int i = 0; i <= 1e5; i++) {
if (st[i])
cout << i << endl;
}
return 0;
}