第九届2018-4日志统计(15分)
package g;
import java.util.*;
public class g2018 {
static class R{
int ts,td;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int N=sc.nextInt();
int D=sc.nextInt();
int K=sc.nextInt();
R[] rs=new R[N];
for (int i=0;i<N;i++){
R r=new R();
r.ts=sc.nextInt();
r.td=sc.nextInt();
rs[i]=r;
}
Arrays.sort(rs, new Comparator<R>() {
@Override
public int compare(R r1, R r2) {
return r1.ts-r2.ts;
}
});
//用于给id计数
Map<Integer,Integer> cnt=new HashMap<Integer,Integer>();
//用于存储答案,(各个id),因为要求答案输出有序,这里直接用TreeSet
SortedSet<Integer> answers=new TreeSet<Integer>();
//尺取法
int j=0;
for(int i=0;i<N;i++){//rs是有序数组!!!!!
while(j<N&&rs[j].ts-rs[i].ts<D){//判断输入的时刻差是否在时间间隔里
int td=rs[j].td; //id出现一次
Integer exit=cnt.get(td);
if(exit!=null){
cnt.put(td,exit+1); //id出现的次数加1
}else{
cnt.put(td,1);//id第一次出现
}
if(cnt.get(td)>=K){//如果id出现两次,输出
answers.add(td);
}
j++;
}
//(马上i就要更新)将上一个id的计数-1
Integer cntOFI=cnt.get(rs[i].td);
if(cntOFI!=null)
cnt.put(rs[i].td,cntOFI-1);
}
for(Integer i:answers){
System.out.println(i);
}
}}