Estadísticas de registro de Blue Bridge Cup Ventana deslizante de doble puntero de Java

Descripción del Título

Xiao Ming mantiene un foro de programadores. Ahora ha recopilado un registro "Me gusta" con N líneas en total.

El formato de cada línea es: ts id
significa que la publicación con id numerada en el momento ts recibió un "me gusta".

Ahora Xiao Ming quiere contar qué publicaciones fueron alguna vez "publicaciones calientes".

Si una publicación ha recibido no menos de K me gusta en cualquier período de tiempo de duración D, Xiaoming piensa que la publicación fue una vez una "publicación caliente".

Específicamente, si hay un cierto momento T que
satisface que la publicación reciba no menos de K me gusta durante el período de [T, T + D) (tenga en cuenta que el intervalo cerrado a la izquierda y abierto a la derecha), la publicación una vez estuvo "caliente Enviar".

Dado un registro, ayude a Xiaoming a contar todos los números de publicaciones que alguna vez fueron "publicaciones calientes".

Formato de entrada

La primera línea contiene tres números enteros N, D, K.

Las siguientes N líneas tienen un registro por línea, que contiene dos enteros ts e id.

Formato de salida

La identificación de la publicación activa se emitirá en orden ascendente.

Cada id ocupa una línea.

rango de datos

1≤K≤N≤105,
0≤ts,id≤105,
1≤D≤10000

Muestra de entrada:

7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

Salida de muestra:

1
3

Temas similares

Arreglo de cuerdas

Subcadena más larga sin repetición

Encuentra todas las palabras disfóricas de letras en la cadena

Subcadena de cobertura mínima

Ideas :

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,则表示这个店铺是热帖;

Código

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

Supongo que te gusta

Origin blog.csdn.net/qq_44844588/article/details/108164968
Recomendado
Clasificación