puntajes de la encuesta

(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 }

 

Supongo que te gusta

Origin www.cnblogs.com/cutepota/p/12593930.html
Recomendado
Clasificación