(Score.cpp 1s 256M)
estudiantes pequeños escolares Hola un total de N, N ° 1-N. La escuela acaba de ser una escuela de la antigua poesía y ensayos de aptitud en prosa. La escuela no dio a conocer los resultados de pruebas, la
pequeña Hola sólo recibe un chisme, tales como un número X de los estudiantes ganar puntos la puntuación más alta que el número de alumnos Y S. Hola pequeña quieren conocer el uso de estos mensajes, no puede ser condenado a
estallar entre las altas y bajas puntuaciones de unos dos estudiantes?
Input
La primera línea contiene tres enteros N, M y Q. N representa el número total de estudiantes, M representa el número total de mensajes en pequeña conocimientos Hola, Q representa el número de pequeñas Hola quiero preguntar.
Cada uno de los tres enteros M línea de fila, X, Y y S. X representa el número de estudiantes puntuación más alta que la puntuación número S Y de los puntos de estudiantes.
Los siguientes dos líneas cada uno números enteros Q, X e Y. Hola representa una pequeña fracción preguntándose número X de estudiantes puntuación más alta que Y número de estudiantes algo.
Para 100% de los datos, 1 <= N, M, Q <= 100000 1 <= X, Y <= N -1000 <= S <= 1000
datos para asegurar que ninguna contradicción.
Output
Para cada interrogatorio, si se determina que X no es mayor que la salida de bit Y-1. De lo contrario la salida X es más alta que las puntuaciones y.
La entrada de la Muestra
10. 5. 3 // número de estudiantes, el número de mensajes, el número de consulta
1 10 2 1 // 2 mayor que 10.
2. 3 10
. 4. 5 -10
. 5. 6 -10
2 10. 5
pregunta si una 10 mayor que 10 @ 1
. 5. 1
. 3. 5
la muestrear la salida
-1 // X no es mayor que y
Y20 puntos más alto que 20 // x
0
Sol: ponderado disjuntos-set, crear primero disjuntos-set para grabar la distancia desde cada nodo al nodo padre.
Consulta, la consulta si la relación entre 3 y 5, 3 y 5 para ver si la misma colección, si en uso desde -3 a 5 a la raíz de la raíz de la distancia, es la respuesta, si no en, la producción -1 .
Código es el siguiente:
1 #include <cstdio> 2 usando espacio de nombres std; 3 int n, m, q, f [ 100,001 ], v [ 100,001 ]; 4 int find ( int x) 5 { 6 si (f [x] == x) de retorno x; 7 int ahora = find (f [x]); 8 v [x] + = v [f [x]]; f [x] = ahora; 9 volver ahora; 10 } 11 int main () 12 { 13 scanf ( " % d% d% d ", Y n-, y m, y Q); 14 para ( int I = 1. ; I <= N-; I ++) F [I] = I; 15 para ( int I = 1. , X, Y, Z; I <= m; I ++ ) 16 { 17. Scanf ( " % D% D% D " , y X, y y, y Z); 18 es int A = Encuentra (X), B = Encuentra (y); . 19 IF (A == B) Continuar ; 20 es F [B] = a; V [B] V = [x] + Z- V [y]; 21 se // fusión, b padre para el punto correcto para el valor del peso de x + x padre es mayor que y el peso del padre -y 22 es } 23 es de( Int i = 1 , x, y; i <= q; i ++) scanf ( " % d% d " , y x, y y), printf ( " % d \ n " , encontrar (x) == encontrar (y) ? v [y] -v [x]: - 1 ); 24 }