Description du titre
Xiao Ming maintient un forum de programmeurs. Maintenant, il a rassemblé un journal "comme" avec N lignes au total.
Le format de chaque ligne est: ts id
signifie que le message avec l'id numéroté au temps ts a reçu un "j'aime".
Maintenant, Xiao Ming veut compter quels messages étaient autrefois des "messages chauds".
Si un message a reçu pas moins de K likes dans une période de temps de longueur D, Xiao Ming pense que le message était autrefois un "message chaud".
Plus précisément, s'il y a un certain moment T qui
satisfait que le message reçoive pas moins de K likes pendant la période de [T, T + D) (notez que l'intervalle gauche-fermé et droit-ouvert), le message était une fois "chaud Publier".
Étant donné un journal, aidez Xiaoming à compter tous les numéros de messages qui étaient autrefois des "messages chauds".
Format d'entrée
La première ligne contient trois entiers N, D, K.
Les N lignes suivantes ont un journal par ligne, contenant deux entiers ts et id.
Format de sortie
L'identifiant de la publication instantanée sera affiché dans l'ordre croissant.
Chaque identifiant occupe une ligne.
plage de données
1≤K≤N≤105,
0≤ts,id≤105,
1≤D≤10000
Échantillon d'entrée:
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
Exemple de sortie:
1
3
Sujets similaires
La plus longue sous-chaîne sans répétition
Trouver tous les mots dysphoriques de lettre dans la chaîne
Sous-chaîne de couverture minimale
Idées :
1.我们要判断一个帖子是不是热帖,就要知道它在某个
区间内是否点赞数大于等于K,而且这个区间还要有序才
能保证答答案的正确性,这就要把时间与对应的id,一
起排序,需要定义一个类,然后用ArrayList.sort去
排序;
class Ps implements Comparable<Ps>{
public int t;
public int id;
public Ps(int t,int id){
this.t=t;
this.id=id;
}
public int compareTo(Ps o){
return Integer.compare(t,o.t);
}
}
2.排好序后我们就在双指针加滑动窗口在规定的区间
里找,不能两重循环暴力找会超时,只能过百分之五
十的数据;
3.用j,i分别表示窗口的左右边界,每次遍历的时候
hot[ps[i].id]++;
当ps[i].t-ps[j].t>=D的时候窗口就要缩小,还要
把左边界所指的那个时间的对应的店铺热度减掉,即
hot[ps[j].id]--;
4.经过上述操作后如果当前时间点对应的店铺的热度
大于等于K,则表示这个店铺是热帖;
Code
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
int D=input.nextInt();
int K=input.nextInt();
Ps[] logs = new Ps[N+1];
int ans[]=new int[1000000];
int hot[]=new int[1000000];
for(int i=0;i<N;i++){
int t=input.nextInt();
int id=input.nextInt();
logs[i] = new Ps(t,id);
}
Arrays.sort(logs,0,N);
for(int i=0,j=0;i<N;i++){
hot[logs[i].id]++;
while(logs[i].t-logs[j].t>=D){
hot[logs[j].id]--;
j++;
}
if(hot[logs[i].id]>=K){
ans[logs[i].id]=1;
}
}
for(int i=0;i<1000000;i++){
if(ans[i]==1)
System.out.println(i);
}
}
}
class Ps implements Comparable<Ps>{
public int t;
public int id;
public Ps(int t,int id){
this.t=t;
this.id=id;
}
public int compareTo(Ps o){
return Integer.compare(t,o.t);
}
}