AcWing 1238. 日志统计【双指针、模拟】
原题链接
中等
一、双指针算法
#include<iostream>
#include<cstdio>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII; // x是时间,y代表帖子id
// pair排序是先x排序,再对y排序,那么就会按时间来排序,同一个时间内可能会有多个帖子,在一段时间内记录帖子的数目
// 采用双指针算法
const int N = 100010;
PII logs[N];
int cnt[N]; // 记录每个帖子id出现的次数
int n, d, k;
bool st[N]; // 记录每个帖子是否是热帖
int main(){
cin >> n >> d >> k;
for(int i = 0;i < n;i++){
scanf("%d%d",&logs[i].x, &logs[i].y);
}
sort(logs,logs+n); // 对帖子时间排序
for(int i = 0,j = 0;i < n;i++){
// int id = logs[i].y;
cnt[logs[i].y]++; //对应id的数量加1
// 注意while循环,改成if就不行了
while(logs[i].x - logs[j].x >= d) // 循环了d时间
{
cnt[logs[j].y]--; // 把最后一个id移出去
j++; // 尾部向右移动一位
} // i在右边,j在左边,i比j更快
if(cnt[logs[i].y] >= k) st[logs[i].y] = true;
}
for(int i = 0;i <= 100000;i++){
if(st[i]){
printf("%d\n",i);
}
}
return 0;
}
二、