AcWing238. Legend of the Galaxy Heroes

AcWing238. Legend of the Galaxy Heroes

Hay un campo de batalla interestelar dividido en N columnas, cada columna está numerada 1, 2, ..., N.

Hay N buques de guerra, que también están numerados 1, 2, ..., N secuencialmente, y el i-ésimo buque de guerra está en la i-ésima columna.

Hay instrucciones T y cada formato de instrucción es uno de los dos siguientes:

1. M ij significa mantener todos los buques de guerra en la fila del acorazado i-ésimo en el orden original y conectarlos a la cola de la fila del acorazado j-ésimo.

2. C ij significa preguntar si el acorazado i-ésimo y el acorazado j-ésimo están actualmente en la misma fila, y si están en la misma fila, cuántos buques de guerra hay entre ellos.

Ahora necesita escribir un programa para procesar una serie de instrucciones.

Formato de entrada

La primera línea contiene un número entero T, lo que significa que hay T instrucciones en total.

La siguiente línea T, una instrucción por línea, la instrucción tiene dos formas: M ij o C ij.

Entre ellos, M y C son letras mayúsculas para indicar el tipo de comando, e i y j son números enteros, que indican el número de barco involucrado en el comando.

Formato de salida

Su programa debe analizar y procesar cada instrucción de entrada por turno:

Si tiene la forma de M ij, significa que la disposición de la flota ha cambiado. Su programa debe prestar atención a esto, pero no generar ninguna información;

Si tiene el formato C ij, su programa debería generar una línea, que contenga solo un número entero, que indique el número de buques de guerra dispuestos entre el i-ésimo acorazado y el j-ésimo en la misma columna. Si el i-ésimo El acorazado y el acorazado j-ésimo no están actualmente en la misma columna, se muestra -1.

rango de datos

N ≤ 30000, T ≤ 500000 N≤30000, T≤500000 norte3 0 0 0 0 ,T5 0 0 0 0 0

Código

#include<iostream>
#include<cstdio>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<algorithm>
#include<vector>
#include<utility>
#include<deque>
#include<unordered_map>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define endl '\n'
#define eps 1e-6
inline int gcd(int a, int b) {
    
     return b ? gcd(b, a % b) : a; }
inline int lowbit(int x) {
    
     return x & -x; }


using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 30030;
int n, p[N], s[N], d[N];

int Find(int x) {
    
    
	if (p[x] != x) {
    
    
		int root = Find(p[x]);
		d[x] += d[p[x]];
		p[x] = root;
	}
	return p[x];
}

int main() {
    
    
		for (int i = 1;i < N;++i) {
    
    
			p[i] = i;
			s[i] = 1;
		}
		
		int n;scanf("%d", &n);
		while (n--) {
    
    
			char op[2];int a, b;
			scanf("%s%d%d", op, &a, &b);
			int pa = Find(a);
			int pb = Find(b);
			if (op[0] == 'M') {
    
    
				p[pa] = pb;
				d[pa] = s[pb];
				s[pb] += s[pa];
			}

			else {
    
    
				if (pa == pb)printf("%d\n", max(0, abs(d[a] - d[b]) - 1));
				else printf("-1\n");
			}
		}

	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zzq0523/article/details/113099598
Recomendado
Clasificación