思路:
1.先想想暴力怎么做,然后再看看有什么重复的地方不,看看能否用双指针优化下
2.涉及到操作,每次操作大于一个数可以试试存到类似C++的结构体中
class Log implements Comparable<Log>{
int t;
int id;
public Log(int t,int id) {
this.t=t;
this.id=id;
}
public int compareTo(Log o) {
return Integer.compare(t, o.t);//根据初始时间大小排序
}
}
public class _1238 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt(),d=scanner.nextInt(),k=scanner.nextInt();
int N=100010;
Log[] logs=new Log[N];//存储每条日志
int[] cnt=new int[N];//记录当前时间段各id的点赞数
boolean[] st=new boolean[N];//记录满足点赞要求的id
for(int i=0;i<n;i++) {
int t=scanner.nextInt(),id=scanner.nextInt();
logs[i]=new Log(t, id);
}
Arrays.sort(logs,0,n);//让日志根据时间从小到大排列
for(int i=0,j=0;i<n;i++) {
int id=logs[i].id;
cnt[id]++;//该条日志的id点赞加一
while(logs[i].t-logs[j].t>=d) {//i走在前面,j走在后面,如果第i条日志的时间与第j条日志的时间差大于d,则j往前走一步
cnt[logs[j].id]--;//原先的日志j就不包含在时间段内,则该id点赞数减一
j++;//往前走一步
}
if(cnt[id]>=k)st[id]=true;//若j~i时间段,id获赞总数满足要求
}
for(int i=1;i<N;i++) {//id从小到大遍历
if(st[i])
System.out.println(i);
}
}
}