有两种属性:id和ts
所以有两种遍历方法
按时间来升序排列
1.遍历时间
用滑动窗口来维护区间d
当时间差大于等于d的时候左端点右移
否则右端点右移, 并每次判断当前的id是否满足阅读量大于等于k
按id来升序排列
2.遍历id
用滑动窗口来维护区间,但要先判断区间内的id是相同的
然后再维护区间
(双指针) O(n)
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
#define x first
#define y second
typedef pair<int,int> pii;
pii w[N];
int n,t,k;
int cnt[N];
bool st[N];
int main()
{
cin >> n >> t >> k;
for(int i = 0; i < n; i ++)
{
scanf("%d %d", &w[i].x, &w[i].y);
}
sort(w, w + n);
for(int i = 0, j = 0; i < n; i ++)
{
int id = w[i].y;
cnt[id] ++;
while(w[i].x - w[j].x >= t)
{
cnt[w[j].y] --;
j ++;
}
if(cnt[id] >= k) st[id] = true;
}
for (int i = 0; i < N; i ++)if(st[i]) cout<<i<<endl;
return 0;
}