Salve, ho provato a fare il problema Licenziamenti, ma mi dà solo 20 punti.
L’algoritmo mi sembra corretto: creo una lista di adiacenza e per ogni nodo assegno ai figli il minore tra il minore che vi è prima del padre e il valore del padre, che rappresenta il minimo valore di bravura che vi è sopra del figlio.
A questo punto conto il numero di persone che hanno valori sopra di loro che sono minori del loro valore.
EDIT: Ricordo che non hanno funzionato solo alcune subtask.
Si tratta praticamente di una dfs, in cui passo ad ogni ramo il minor valore che compare tra tutti i suoi precedenti. A quel punto conto quelli che hanno questo valore minore strettamente della loro bravura: se sì, vuol dire che hanno bravura maggiore di quella di un loro capo, e vanno quindi licenziati.
A livello teorico dovrebbe funzionare: è abbastanza semplice.
La tua “dfs” assume che i nodi con numerazione più bassa si trovino sempre più in alto dei nodi con numerazione più alta; per esempio: il nodo 5 non può essere padre del nodo 3.
Non ho usato dfs e neanche la lista delle adiacenze, ho trovato le foglie e sono andato da quelle su per l’albero fino ad incontrare un nodo già visitato e la soluzione dovrebbe essere O(N).
Perfettamente d’accordo, inoltre il tempo per trovare le foglie è ampiamente compensato dal tempo risparmiato evitando di creare le liste di adiacenza ( a suon di pushback su un vector di vector).