La próxima conferencia en una escuela secundaria requiere dos temas a tratar. El i tema i-ésima es interesante por una i ai unidades para el maestro y por b i unidades bi para los estudiantes.
El par de temas i i y j j ( i < j i <j) se llama bueno si un i + un j > b i + b j ai + aj> bi + bj (es decir, es más interesante para el maestro).
Su tarea es encontrar el número de buenos pares de temas.
Entrada
La primera línea de la entrada contiene un entero n n ( 2 ≤ n ≤ 2 ⋅ 10 5 2≤n≤2⋅105) - el número de temas.
La segunda línea de la entrada contiene n n enteros un 1 , un 2 , ... , un n a1, a2, ..., an ( 1 ≤ un i ≤ 10 9 1≤ai≤109), donde una i ai es la interestingness de el i i-ésima tema para el maestro.
La tercera línea de la entrada contiene n n números enteros b 1 , b 2 , ... , b n b1, b2, ..., bn ( 1 ≤ b i ≤ 10 9 1≤bi≤109), donde b i bi es la interestingness de el i i-ésima tema para los estudiantes.
Salida
Imprimir un número entero - el número de buenos pares de tema.
Ejemplos
5 4 8 2 6 2 4 5 4 1 3
7
4 1 3 2 4 1 3 2 4
0
Esta es una cuestión de rutina sobre el cambio de artículo en ai-bi, entonces en primer lugar ai-bi = Ci tipo. Para CI + cj> 0, uno de los dos debe ser de al menos 0, se desciende de nuevo barrido, cuando ci es mayor que 0, con el primer número es mayor que el encontrado -ci de límite superior, por lo que este será capaz de intervalo de garantía número de carril superior a 0, la respuesta a la longitud acumulada en la línea.
De hecho, también puede hacer doble puntero mientras se mueve a la mitad, por lo que escribir un poco largo aliento-relativamente pequeño, pero constante, se puede vivir mucho tiempo en vivo ....
#include <iostream> #include <cstdio> #include <cstring> #include <algoritmo> #include <cmath> usando espacio de nombres std; struct buena { int a, b; } g [ 200,005 ]; int res [ 200005 ]; int n; int main () { cin >> n; int i; para (i = 1 ; i <= n; i ++) scanf ( " % d " , y g [i] .a); para (i = 1; i <= n; i ++) scanf ( " % d " , y g [i] .b); para (i = 1 ; i <= n; i ++) res [i] = g [i] .a- g [i] .B; sort (res + 1 , res + n + 1 ); largo largo ans = 0 ; para (i = n; i> = 1 ; i-- ) { si (res [i < 0 ]) descanso ; int pos = UPPER_BOUND (res + 1 , res + i + 1 , -res [i]) - res; si (pos> = 1 && pos < i) { años + i = pos; } } Cout << años; }