Codeforces Ronda # 627 (Div. 3) D. Par de Temas (binario / recorrido directo)

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

Entrada
5 
4 8 2 6 2 
4 5 4 1 3
Salida
7
Entrada
4 
1 3 2 4 
1 3 2 4
Salida
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; 
 }

 



Supongo que te gusta

Origin www.cnblogs.com/lipoicyclic/p/12590480.html
Recomendado
Clasificación