import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//输入n,d,k;
int n = scan.nextInt();
int d = scan.nextInt();
int k = scan.nextInt();
//创建R类型数组,将输入的各个R对象存入
R[] rs = new R[n];
for(int i = 0;i < n;i ++) {
R r = new R();
r.st = scan.nextInt();
r.sd = scan.nextInt();
rs[i] = r;
}
//将数组中的记录,按照st进行升序排序
//匿名内部类进行排序
Arrays.sort(rs,new Comparator<R>() {
@Override
public int compare(R r1,R r2) {
// TODO Auto-generated method stub
return r1.st - r2.st;
}
});
//记录每次sd出现的次数
//用hashMap来存入sd的数量,因为它通过键值对,且不重复;键是id,值是id出现的次数
Map<Integer,Integer> cnt = new HashMap<>();
//记录存放结果
//new TreeSet<>():是创建一个TreeSet实例的语句。
//TreeSet是SortedSet接口的一个实现类,它使用红黑树数据结构来存储元素,可以保证元素的有序性
//它的特点是不允许存储重复的元素。当向TreeSet中添加一个已经存在的元素时,该元素不会被添加到集合中,也不会抛出异常。
SortedSet<Integer> answers = new TreeSet<>();
//对排好序的数组进行双指针遍历
int j = 0;
for(int i = 0;i < n;i ++) {
while(j < n && rs[j].st - rs[i].st < d) {//j从sd遍历,当j<n并且日期<d进行遍历,因为当日期差大于等于d,便不是热帖
Integer s = rs[j].sd;
if(cnt.get(s) != null) {//判断sd是否已经存在。若不存在,则赋值·1,若存在,则加1
cnt.put(s, cnt.get(s) +1);
}else {
cnt.put(s, 1);//第一次出现
}
if(cnt.get(s) >= k) {//若在k天内,达到k次,便是热搜,直接存进结果中
answers.add(s);
}
j ++;
}
//当i向下遍历的时候,在i没有改变之前,如过cnt中i对应的值,不为空,应当-1,因为他已经超出d的范围了
if(cnt.get(rs[i].sd) != null) {
cnt.put(rs[i].sd,cnt.get(rs[i].sd) - 1);
}
}
for(Integer i: answers) {
System.out.println(i);
}
}
//将st,sd捆绑起来
static class R{
int st;
int sd;
}
}
AcwingP1238-日志统计
最新推荐文章于 2024-10-04 12:19:51 发布