Blue Bridge Cup Log Statistics Fenêtre coulissante à double pointeur Java

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

Arrangement de cordes

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);
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_44844588/article/details/108164968
conseillé
Classement