题目:https://www.acwing.com/problem/content/1240/
思路:按时间顺序排序日志;从前往后遍历,当时间差
≥
\geq
≥d时,就让时间段的左端点对应日志数
−
−
--
−−,伪代码如下
for(i=0,j=0;i<n;i++){
while(时间差>=d)
{
cnt[id_j]--;
j++; //左指针右移
}
if(cnt[id_i]>=k) 标记id_i为热帖
}
y总的代码:
#include<iostream>
#include<cstdio>
#include<utility>
#include<algorithm>
using namespace std;
const int N=1e5+5;
typedef pair<int,int> PII;
#define x first
#define y second
PII logs[N];
int cnt[N];
bool st[N];
int main(){
int n,d,k;
scanf("%d%d%d",&n,&d,&k);
for(int i=0;i<n;i++) scanf("%d%d",&logs[i].x,&logs[i].y);
sort(logs,logs+n); //先按照pair.first排序,pair.first相等,再按pair.second 排序
for(int i=0, j=0;i<n;i++){
int id=logs[i].y;
cnt[id]++;
while(logs[i].x-logs[j].x>=d){
cnt[logs[j].y]--;
j++;
}
if(cnt[id]>=k)st[id]=1;
}
for(int i=0;i<=1e5;i++)
if(st[i]) printf("%d\n",i);
return 0;
}
y总代码太简介美观,难以修改。