Submission #386948

#TimeUsernameProblemLanguageResultExecution timeMemory
386948BlancaHMEaster Eggs (info1cup17_eastereggs)C++14
100 / 100
40 ms492 KiB
#include <iostream> #include <vector> #include <map> #include <unordered_set> #include <algorithm> #include <set> #include <queue> #include "grader.h" using namespace std; void inicializar(set<int> & posibilidadesHuevo, vector<pair<int, int>> & aristas, vector<vector<int>> & listaAdyacencia) { int N = (int) aristas.size() + 1; listaAdyacencia = vector<vector<int>>(N); for (int i = 0; i < N; i++) { posibilidadesHuevo.insert(i); // añadimos la isla a las posibilidades restantes if (i) { // añadimos la arista a la lista de adyacencia int a = aristas[i-1].first - 1, b = aristas[i-1].second - 1; listaAdyacencia[a].push_back(b); listaAdyacencia[b].push_back(a); } } } vector<int> procesar(set<int> & seleccionActual, set<int> & posibilidadesHuevo) { // creamos un vector con la mitad seleccionada para poder hacer la pregunta vector<int> queryVec = vector<int>(), siguienteSeleccion = vector<int>(); queryVec.clear(); siguienteSeleccion.clear(); for (auto it = seleccionActual.begin(); it != seleccionActual.end(); it++) queryVec.push_back(*it + 1); // hacemos la pregunta if (query(queryVec) == 1) { // islasEnLaSeleccion = intersección de posibilidadesHuevo y seleccionActual for (int is : posibilidadesHuevo) { if (seleccionActual.find(is) != seleccionActual.end()) siguienteSeleccion.push_back(is); } } else { // islasEnLaSeleccion = intersección de posibilidadesHuevo y NO seleccionActual for (int is : posibilidadesHuevo) { if (seleccionActual.find(is) == seleccionActual.end()) siguienteSeleccion.push_back(is); } } return siguienteSeleccion; } int findEgg(int N, vector<pair<int, int>> aristas) { vector<vector<int>> listaAdyacencia; set<int> posibilidadesHuevo, seleccionActual; inicializar(posibilidadesHuevo, aristas, listaAdyacencia); queue<int> cola; while((int) posibilidadesHuevo.size() > 1) { seleccionActual = set<int>(); seleccionActual.insert(*posibilidadesHuevo.begin()); cola = queue<int>(); cola.push(*posibilidadesHuevo.begin()); int islasEnLaSeleccion = 1; while (!cola.empty()) { if (islasEnLaSeleccion * 2 >= (int) posibilidadesHuevo.size()) break; // ya tenemos la mitad de las islas seleccionadas -> no queremos más int islaActual = cola.front(); // en caso contrario, seleccionamos una isla del frente de la cola cola.pop(); // la quitamos de la cola for (int islaVecina : listaAdyacencia[islaActual]) { if (islasEnLaSeleccion * 2 >= (int) posibilidadesHuevo.size()) break; if (seleccionActual.find(islaVecina) == seleccionActual.end()) { // no hemos seleccionado aún esta isla -> la añadimos seleccionActual.insert(islaVecina); cola.push(islaVecina); if (posibilidadesHuevo.find(islaVecina) != posibilidadesHuevo.end()) islasEnLaSeleccion++; // no estaba descartada esta isla -> incrementamos el contador } if (islasEnLaSeleccion * 2 >= (int) posibilidadesHuevo.size()) break; } } // procesamos nuestra selección para obtener la siguiente, quedándonos con la mitad vector<int> siguienteSeleccion = procesar(seleccionActual, posibilidadesHuevo); posibilidadesHuevo.clear(); for (int isla: siguienteSeleccion) posibilidadesHuevo.insert(isla); } return *posibilidadesHuevo.begin() + 1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...