PAT B1065 Single Dog (25 puntos)

Inserte la descripción de la imagen aquí
En esta pregunta, la cantidad de datos ha llegado a 10 ^ 5. Si la violencia de doble bucle es de complejidad de tiempo O (n2), definitivamente habrá un tiempo de espera de punto de prueba.
Por lo tanto, debe pensar en el espacio para el tiempo. Para esta pregunta, puede abrir dos tablas hash, una se usa para registrar a cada cónyuge numerado (el valor predeterminado no existe -1) y la otra se usa para registrar si un número es entre los participantes del partido ingresados ​​Ha aparecido (el valor predeterminado es falso).
Primero ingrese los n pares de cónyuges ingresados ​​en la pregunta en la primera tabla hash, y luego cambie el valor de la segunda tabla hash correspondiente a los m participantes ingresados ​​en la pregunta a verdadero (lo que indica que han aparecido).
Finalmente, envíe los que son solteros (es decir, el valor de la primera tabla hash es -1 o el valor del cónyuge en la segunda tabla hash es falso).

#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

int spouse[100010];
bool cunzai[100010] = {
    
    false};

void init(){
    
    
	for(int i=0; i<=100010; i++){
    
    
		spouse[i] = -1;
	}
}

int main(){
    
    
	init();
	int n;
	scanf("%d", &n);
	for(int i=0; i<n; i++){
    
    
		int a, b;
		scanf("%d %d", &a, &b);
		spouse[a] = b;
		spouse[b] = a;
	}
	
	scanf("%d", &n);
	int arr[n];
	int num = 0;
	for(int i=0; i<n; i++){
    
    
		int bh;
		scanf("%d", &bh);
		cunzai[bh] = true;
		arr[num++] = bh;
	}
	int res[n];
	int r_num = 0;
	for(int i=0; i<num; i++){
    
    
		if(spouse[arr[i]]==-1 || !cunzai[spouse[arr[i]]]){
    
    
			res[r_num++] = arr[i];
		}
	}
	
	sort(res, res+r_num);
	printf("%d\n", r_num);
	for(int i=0; i<r_num; i++){
    
    
		printf("%05d", res[i]);
		if(i != r_num-1) printf(" ");
	}
	
	return 0;
}


Supongo que te gusta

Origin blog.csdn.net/weixin_45964844/article/details/113757809
Recomendado
Clasificación