先将日志按时间升序排序,用一个双端队列及一个计数数组cnt[]维护[T, T+D)区间内的热帖,再用一个set维护答案数组
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int cnt[N];
vector<pair<int, int>> v;
int main()
{
int n, d, k;
cin >> n >> d >> k;
v.resize(n);
set<int> ans;
for(int i = 0;i < n;i++) {
cin >> v[i].first >> v[i].second;
}
sort(v.begin(), v.end());
deque<int> q;
for(int i = 0;i < n;i++) {
while(!q.empty() && v[i].first - v[q.front()].first >= d) {
--cnt[v[q.front()].second];
q.pop_front();
}
q.push_back(i);
if(++cnt[v[i].second] >= k) ans.insert(v[i].second);
}
for(auto i : ans) cout << i << endl;
return 0;
}