Estaba tratando de resolver una pregunta de programación competitiva en Java.
Pregunta original: se le darán intensidades Ai de N errores. Ahora la intensidad relativa de un error se puede calcular tomando el MCD de las intensidades del resto de errores N-1. Dadas las consultas Q que contienen un solo entero X, debe encontrar la cantidad de errores que tienen una intensidad relativa mayor que X. donde
1 <= N <= 10^5 1 <= Q <= 10^5 1 <= Ai <= 10^9 1 <= X <= 10^5Obtengo TLE para 6 TC de 10. ¿Alguien puede ayudarme a encontrar una solución factible?
Mi código:
public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int t=sc.nextInt(); int []arr=new int[n]; for (int i = 0; i < n; i++) { arr[i]=sc.nextInt(); } arr=mergeSort(arr); int gcd=arr[0]; for(int i = 1; i < n; i++){ gcd = gcd(gcd, arr[i]); } while(t-->0){ int comp=sc.nextInt(); int count=0; if (arr[1]>gcd) { int tempgcd=arr[1]; for(int i = 2; i < n; i++){ tempgcd = gcd(tempgcd, arr[i]); } if (tempgcd>comp) { ++count; } } if (gcd>comp) { count=count+n-1; } System.out.println(count); } sc.close(); }Haz dos arreglos auxiliares.
Rellene L[] por mcd de elementos de izquierda a derecha.
Rellene R[] por mcd de elementos de derecha a izquierda.
Ahora encuentra la intensidad relativa para el i-ésimo error como gcd(L[i-1], R[i+1])
(las optimizaciones son posibles)