Algorithm


Problem Name: 2 AD-HOC - beecrowd | 2460

Problem Link: https://www.beecrowd.com.br/judge/en/problems/view/2460

Fila

 

Por OBI - Olimpíada Brasileira de Informática 2014 BR Brazil

Timelimit: 1

Com a proximidade da Copa do Mundo, o fluxo de pessoas nas filas para compra de ingressos aumentou consideravelmente. Como as filas estão cada vez maiores, pessoas menos pacientes tendem a desistir da compra de ingressos e acabam deixando as filas, liberando assim vaga para outras pessoas. Quando uma pessoa deixa a fila, todas as pessoas que estavam atrás dela dão um passo a frente, sendo assim nunca existe um espaço vago entre duas pessoas. A fila inicialmente contém N pessoas, cada uma com um identificador diferente. Joãozinho sabe o estado inicial dela e os identificadores em ordem das pessoas que deixaram a fila. Sabendo que após o estado inicial nenhuma pessoa entrou mais na fila, Joãozinho deseja saber o estado final da fila.

 

Entrada

 

A primeira linha contém um inteiro N (1 ≤ N ≤ 50000) representando a quantidade de pessoas inicialmente na fila. A segunda linha contém N inteiros representando os identificadores das pessoas na fila. O primeiro identificador corresponde ao identificador da primeira pessoa na fila. É garantido que duas pessoas diferentes não possuem o mesmo identificador. A terceira linha contém um inteiro M (1 ≤ M ≤ 50000 e M < N) representando a quantidade de pessoas que deixaram a fila. A quarta linha contém M inteiros representando os identificadores das pessoas que deixaram a fila (cada identificador está entre 1 e 100000), na ordem em que elas saíram. É garantido que um mesmo identificador não aparece duas vezes nessa lista.

 

Saída

 

Seu programa deve imprimir uma linha contedo N − M inteiros com os identificadores das pessoas que permaneceram na fila, em ordem de chegada.

 

 

 

Exemplos de Entrada Exemplos de Saída

8

5 100 9 81 70 33 2 1000

3

9 33 5

100 81 70 2 1000

 

Code Examples

#1 Code Example with C Programming

Code - C Programming


#include <stdio.h>
#include <string.h>
#include <stdbool.h>

typedef struct{

	unsigned short numero;
	unsigned short posicao;

} pessoa;


int main (void)
{

	/*
		qtsPessoas receberá a quantidade de pessoas na fila;
		qtsPessoasSairam receberá a quantidade de pessoas que saíram da fila;
		i será o índice em várias ocasiões;
		idPessoa será o identificador da pessoa na fila;
		fila[51000] será o vetor de struct que conterá as informações de posição e id de cada pesoa;
	*/

	unsigned short qtsPessoas, qtsPessoasSairam;
	unsigned short i, idPessoa;
	pessoa fila[51000];

	scanf("%hu", &qtsPessoas);

	memset(fila, 0, sizeof(fila));

	// Esse laço enche a struct com os id's das pessoas na fila;
	// O campo posição salva a posição da pessoa no momento da inserção,
	// Entretanto não o faz na posição 'i' e sim na posição de seu id;
	// Isso proporcionará um acesso instantâneo mais tarde sem precisar fazer
	// Uma pesquisa linear todas as vezes que eu quiser "retirar" alguém da fila;
	for (i = 0; i  <  qtsPessoas; i++)
	{
		scanf("%hu", &idPessoa);
		fila[i].numero = idPessoa;
		fila[idPessoa].posicao = i;

	}


	scanf("%hu", &qtsPessoasSairam);

	// Como não há identificador '0' para ninguém
	// As pessoas que saíram da fila recebem 0 na posição em que foi salva originalmente
	// Mas a pesquisa é "instantânea", pois eu procuro pelo índice em que ela foi salva dentro
	// da própria struct;
	for (i = 0; i  <  qtsPessoasSairam; i++)
	{

		scanf("%hd", &idPessoa);
		fila[fila[idPessoa].posicao].numero = 0;

	}

	// Aqui um truque para passar na impressão da questão
	// Não pode haver espaços no começo nem no final da impressão;
	// Por isso, uma variável 'flag' verifica se já foi impresso alguma coisa
	// Note que pode haver o número 0 na primeira ou demais posições e ele não será impresso
	// Por isso, é necessário verificar se alguma coisa já foi impressa até o momento;
	bool primEspaco = false;
	for (i = 0; i  <  qtsPessoas; i++)
		if (fila[i].numero)
		{
			if (primEspaco == true && i != qtsPessoas)
				printf(" ");

			primEspaco = true;
			printf("%hu", fila[i].numero);
		}

	printf("\n");
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
8
5 100 9 81 70 33 2 1000
3
9 33 5

Output

x
+
cmd
100 81 70 2 1000

#2 Code Example with C++ Programming

Code - C++ Programming


#include <cstdio>
#include <set>
#define MAX 50010
using namespace std;
int vetor[MAX], n, m, i, davez;
set < int> removidos;
int main() {
    scanf("%d", &n);
    for (i = 0; i  <  n; i++) scanf("%d", &vetor[i]);
    scanf("%d", &m);
    for (i = 0; i  <  m; i++) {
        scanf("%d", &davez);
        removidos.insert(davez);
    }
    int exibicao = 0;
    for (i = 0; i  <  n; i++) {
        if (removidos.count(vetor[i]) == 1) continue;
        if (exibicao)
            printf(" ");
        else
            exibicao = 1;
        printf("%d", vetor[i]);
    }
    printf("\n");
    return 0;
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
8
5 100 9 81 70 33 2 1000
3
9 33 5

Output

x
+
cmd
100 81 70 2 1000

#3 Code Example with Javascript Programming

Code - Javascript Programming


const { readFileSync } = require("fs")
const lines = readFileSync("/dev/stdin", "utf8")
	.split("\n")
	.map((line) => line.split(" ").map((value) => Number.parseInt(value, 10)))

const N = lines[0][0]
const M = lines[2][0]

const inQueue = lines[1].slice(0, N)
const outQueue = lines[3].slice(0, M)

const stillInQueue = inQueue.filter((p) => !outQueue.includes(p))

console.log(stillInQueue.join(" "))
Copy The Code & Try With Live Editor
Advertisements

Demonstration


Previous
#2459 Beecrowd Online Judge Solution 2459 Copa do Mundo Solution in C, C++, Java, Js and Python
Next
#2461 Beecrowd Online Judge Solution 2461 Bluff Solution in C, C++, Java, Js and Python