【题目描述 】
解法一
【思路】
排序 枚举
1、 对日志记录按(id,时间)升序排序
2 、遍历日志记录,最低要求:至少与当前第i条记录相距为 K - 1的那条记录也要是相同id且时间范围在D内
import java.io.*;
import java.lang.Math;
import java.util.Arrays;
class blog implements Comparable<blog>{
int id, ts;
public blog (int idd, int tss){
id = idd;
ts = tss;
}
//按(id,时间)升序排序
public int compareTo(blog o){
if(this.id == o.id) return this.ts - o.ts; //id相同则按时间排序
else return this.id - o.id;
}
public String toString(){
return this.id+" "+ this.ts +" \n";
}
}
public class Main{
static int N = 100010;
static blog[] q= new blog[N];
static boolean[] st = new boolean[N];
static int [] cnt = new int[N];
public static void main(String args[]) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s[] = bf.readLine().split(" ");
int n = Integer.parseInt(s[0]), D = Integer.parseInt(s[1]), K = Integer.parseInt(s[2]);
for(int i = 0; i < n; i ++){
String data[] = bf.readLine().split(" ");
int a = Integer.parseInt(data[0]);
int b = Integer.parseInt(data[1]);
q[i] = new blog(b,a);
}
Arrays.sort(q, 0, n);
for(int i = 0; i < n; i ++){
//最低要求:至少第next条记录也要是相同id且时间范围在D内
int next = i + K - 1;
if(next >= n) continue;
int id = q[next].id;
int t = q[next].ts;
if(next < n && id == q[i].id && t - q[i].ts < D)
st[id] = true;
}
for(int j =0; j < N; j ++)
if(st[j]) System.out.println(j);
}
}
解法二
【思路】
双指针
1、 对日志记录按(时间,id)升序排序
2 、for(时间段)
在枚举该时间段内的所有id时存在重复计算的区间,使用双指针进行优化
import java.io.*;
import java.lang.Math;
import java.util.Arrays;
class blog implements Comparable<blog>{
int id, ts;
public blog (int idd, int tss){
id = idd;
ts = tss;
}
//按时间升序排序
public int compareTo(blog o){
if(this.ts == o.ts) return this.id - o.id;
else return this.ts - o.ts;
}
public String toString(){
return this.ts +" "+this.id+" \n";
}
}
public class Main{
static int N = 100010;
static blog[] q= new blog[N];
static boolean[] st = new boolean[N];
static int [] cnt = new int[N];
public static void main(String args[]) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s[] = bf.readLine().split(" ");
int n = Integer.parseInt(s[0]), D = Integer.parseInt(s[1]), K = Integer.parseInt(s[2]);
for(int i = 0; i < n; i ++){
String data[] = bf.readLine().split(" ");
int a = Integer.parseInt(data[0]);
int b = Integer.parseInt(data[1]);
q[i] = new blog(b,a);
}
Arrays.sort(q, 0, n);
//双指针 i在前 j在后
for(int i =0, j = 0; i < n; i ++){
int id = q[i].id;
cnt[ id ]++;
while( q[i].ts - q[j].ts >= D){//两个时间差大于K j则要追上
cnt[ q[j].id ] --;
j ++;
}
if(cnt[id] >= K ) st[id] = true;
}
for(int j =0; j < N; j ++)
if(st[j]) System.out.println(j);
}
}
佬能看看我哪里错了吗?
###能看我哪里错了吗
for(int j=0;j<n;j++) {
if(st[j])System.out.println(j);
}
这里统计的时候不对,是 j <N,要遍历所有的id。
tql orz