AcWing
1238. 日志统计
首先对所有日志按时间递增排序,之后时间段d
的窗口在排序后的序列中取。
初始化左、右端点i=1
, j=1
;
- 移动右端点
i
,每次移动使得cnt[log[i].id] ++
;- 对于每个右端点
i
,向右移动左端点j
,直到左右端点所表示的时间范围在时间段d
之内,每一次移动左端点j
,将移出的左端点j
所代表的id
的获赞次数-1
; - 此后,如果
cnt[log[i].id] >= k
,那么认为这个帖子曾是热帖。
- 对于每个右端点
#include <bits/stdc++.h>
using namespace std;
int n, d, k;
const int N = 100010;
typedef pair<int, int> PII;
#define ts first
#define id second
PII logs[N];
int cnt[N];
bool ishot[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> d >> k;
for(int i = 1; i <= n; i ++) cin >> logs[i].ts >> logs[i].id;
sort(logs + 1, logs + 1 + n);
for(int i = 1, j = 1; i <= n; i ++){
int t = logs[i].id;
cnt[t] ++;
while(logs[i].ts - logs[j].ts >= d){
cnt[logs[j].id] --;
j ++;
}
if(cnt[t] >= k) ishot[t] = true;
}
for(int i = 0; i <= 100000; i++) if(ishot[i]) cout << i << '\n';
return 0;
}