Dans cette question, la quantité de données a atteint 10 ^ 5. Si la violence à double boucle est de complexité temporelle O (n2), il y aura certainement un délai d'expiration du point de test.
Par conséquent, vous devez penser à l'espace pour le temps. Pour cette question, vous pouvez ouvrir deux tables de hachage, l'une est utilisée pour enregistrer chaque conjoint numéroté (la valeur par défaut n'existe pas -1) et l'autre est utilisée pour enregistrer si un nombre est parmi les participants du groupe entrés est apparu (la valeur par défaut est false).
Entrez d'abord les n paires de conjoints saisis dans la question dans la première table de hachage, puis modifiez la valeur de la deuxième table de hachage correspondant aux m participants saisis dans la question sur vrai (indiquant qu'ils sont apparus).
Enfin, affichez ceux qui sont célibataires (c'est-à-dire que la valeur de la première table de hachage est -1 ou la valeur du conjoint dans la deuxième table de hachage est fausse).
#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;
}